C#增強響應性,用加載窗體(tǐ)(Splash)來載入主窗體(tǐ)

發布時間:2011年03月16日      浏覽次數:769 次
許多軟件在啓動的時候都會顯示一(yī)個加載窗口(Splash),譬如微軟的Visual Studio、Office以及Adobe的許多軟件。這些加載窗口很精美,但“漂亮”并不是它們的主要作用。
設想一(yī)下(xià)用戶雙擊了一(yī)個圖标,等了許久都沒有看到主窗體(tǐ),就會感到迷惑:是不是剛才沒有點中(zhōng)?于是又(yòu)雙擊了一(yī)次,這次終于看到主窗體(tǐ)了,但看到了兩個,因爲啓動了兩次。
如果加載主窗體(tǐ)需要大(dà)量時間,那麽在加載主窗體(tǐ)的同時去(qù)顯示一(yī)個加載窗體(tǐ)就可以讓用戶知(zhī)道軟件已經響應了指令,并且正在進行處理,還可以告訴用戶當前處理的進度,從而避免了用戶的迷惑和誤操作。
恰巧最近我(wǒ)(wǒ)的客戶也有這樣的抱怨,便研究了一(yī)下(xià)加載窗體(tǐ)的實現方法,順便記錄在這裏以免遺忘。
那麽就開(kāi)始編寫一(yī)個加載窗體(tǐ)吧。
我(wǒ)(wǒ)創建了一(yī)個很簡單的窗體(tǐ),它隻包含一(yī)個Style=Marquee的ProgressBar(這個進度條會不斷滾動),下(xià)面是它的代碼以及注釋:
public partial class Splash : Form
{
public Splash()
{
InitializeComponent();
}
//關閉自身
public void KillMe(object o, EventArgs e)
{
this.Close();
}
/// <summary>
/// 加載并顯示主窗體(tǐ)
/// </summary>
/// <param name="form">主窗體(tǐ)</param>
public static void LoadAndRun(Form form)
{
//訂閱主窗體(tǐ)的句柄創建事件
form.HandleCreated += delegate
{
//啓動新線程來顯示Splash窗體(tǐ)
new Thread(new ThreadStart(delegate
{
Splash splash = new Splash();
//訂閱主窗體(tǐ)的Shown事件
form.Shown += delegate
{
//通知(zhī)Splash窗體(tǐ)關閉自身
splash.Invoke(new EventHandler(splash.KillMe));
splash.Dispose();
};
//顯示Splash窗體(tǐ)
Application.Run(splash);
})).Start();
};
//顯示主窗體(tǐ)
Application.Run(form);
}
代碼很好理解,Splash類隻包含兩個方法:一(yī)個普通的事件處理程序KillMe和一(yī)個靜态方法LoadAndRun。
LoadAndRun方法用于加載并顯示主窗體(tǐ)。在加載主窗體(tǐ)的同時,Splash窗體(tǐ)也會一(yī)直顯示,直到主窗體(tǐ)加載完畢可以完全顯示爲止。
使用此加載窗體(tǐ)的方法也很簡單,隻需要把Program.cs中(zhōng)Main方法裏的
Application.Run(new Form1());
修改爲
Splash.LoadAndRun(new Form1());
即可。
如果想要看到效果,可以在Form1的OnLoad事件中(zhōng)讓主線程睡一(yī)會兒覺,譬如:
protected override void OnLoad(EventArgs e)
{
System.Threading.Thread.Sleep(5000);
base.OnLoad(e);
}
爲什麽要在新線程中(zhōng)顯示加載窗體(tǐ)呢?因爲忙碌的主窗體(tǐ)已經占有了主線程,如果把加載窗體(tǐ)也安排到主線程的話(huà),它不僅很容易變成“失去(qù)響應”的狀态,而且有可能連自身都無法順利加載完,更别說不斷滾動的進度條了。
另外(wài),這種方法還有一(yī)個缺點,如果主窗體(tǐ)加載緩慢(màn)是因爲在構造函數中(zhōng)執行了大(dà)量操作的話(huà),那麽這種方法就起不到作用了。
不過話(huà)說回來,在窗體(tǐ)的構造函數中(zhōng)執行影響性能的操作本來就是不被推薦的做法,應當盡量避免。
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!