1. 程式人生 > >[C#]增強響應性,用載入窗體(Splash)來載入主窗體

[C#]增強響應性,用載入窗體(Splash)來載入主窗體

許多軟體在啟動的時候都會顯示一個載入視窗(Splash),譬如微軟的Visual Studio、Office以及Adobe的許多軟體。這些載入視窗很精美,但“漂亮”並不是它們的主要作用。

設想一下使用者雙擊了一個圖示,等了許久都沒有看到主窗體,就會感到迷惑:是不是剛才沒有點中?於是又雙擊了一次,這次終於看到主窗體了,但看到了兩個,因為啟動了兩次。

如果載入主窗體需要大量時間,那麼在載入主窗體的同時去顯示一個載入窗體就可以讓使用者知道軟體已經響應了指令,並且正在進行處理,還可以告訴使用者當前處理的進度,從而避免了使用者的迷惑和誤操作。

恰巧最近我的客戶也有這樣的抱怨,便研究了一下載入窗體的實現方法,順便記錄在這裡以免遺忘。

那麼就開始編寫一個載入窗體吧。

我建立了一個很簡單的窗體,它只包含一個Style=Marquee的ProgressBar(這個進度條會不斷滾動),下面是它的程式碼以及註釋:

public partial class Splash : Form 
{ 
    public Splash() 
    { 
        InitializeComponent(); 
    }
    //關閉自身 
    public void KillMe(object o, EventArgs e) 
    { 
        this.Close(); 
    }
    /// <summary> 
    /// 載入並顯示主窗體 
    /// </summary> 
    /// <param name="form">主窗體</param> 
    public static void LoadAndRun(Form form) 
    { 
        //訂閱主窗體的控制代碼建立事件 
        form.HandleCreated += delegate
        { 
            //啟動新執行緒來顯示Splash窗體 
            new Thread(new ThreadStart(delegate
            { 
                Splash splash = new Splash(); 
                //訂閱主窗體的Shown事件 
                form.Shown += delegate
                { 
                    //通知Splash窗體關閉自身 
                    splash.Invoke(new EventHandler(splash.KillMe)); 
                    splash.Dispose(); 
                }; 
                //顯示Splash窗體 
                Application.Run(splash);
            })).Start(); 
        }; 
        //顯示主窗體 
        Application.Run(form); 
    }

程式碼很好理解,Splash類只包含兩個方法:一個普通的事件處理程式KillMe和一個靜態方法LoadAndRun。

LoadAndRun方法用於載入並顯示主窗體。在載入主窗體的同時,Splash窗體也會一直顯示,直到主窗體載入完畢可以完全顯示為止。

使用此載入窗體的方法也很簡單,只需要把Program.cs中Main方法裡的

Application.Run(new Form1());
//修改為
Splash.LoadAndRun(new Form1());

即可。

如果想要看到效果,可以在Form1的OnLoad事件中讓主執行緒睡一會兒覺,譬如:

protected override void OnLoad(EventArgs e) 
{ 
    System.Threading.Thread.Sleep(5000); 
    base.OnLoad(e); 
}

為什麼要在新執行緒中顯示載入窗體呢?因為忙碌的主窗體已經佔有了主執行緒,如果把載入窗體也安排到主執行緒的話,它不僅很容易變成“失去響應”的狀態,而且有可能連自身都無法順利載入完,更別說不斷滾動的進度條了。

另外,這種方法還有一個缺點,如果主窗體載入緩慢是因為在建構函式中執行了大量操作的話,那麼這種方法就起不到作用了。

不過話說回來,在窗體的建構函式中執行影響效能的操作本來就是不被推薦的做法,應當儘量避免。