2015-05-28 41 views
-3

如何在點擊按鈕後使用後臺工作器加載表單?我會用它,因爲我的表單需要大約20-30秒才能加載。請幫幫我。如何使用後臺工作器加載表單? c#

+5

http://stackoverflow.com/help/how-to-ask 你目前在解決這個問題上的嘗試是什麼?任何簡短的例子?向我們展示你到目前爲止所研究的內容。 – SailAvid

+1

特定於UI的所有內容都屬於mainthread。如果您的表單需要很長時間才能加載,那麼將其加載緩慢的內容放入不同的線程中,而不是加載本身。但是要注意,將它放到不同的線程中會使表單本身不能更早使用,如果工作表單需要在後臺加載的東西。 – Ralf

+0

我看過教程。他們使用進度條,當進度條達到100%時,會彈出一條消息,提示「成功」。在我的情況下,當進度條工作達到100%時,我想同時加載我的表單,以最小化加載表單的等待時間。請幫助我 – Qwerty

回答

0

這裏是一個簡單的表單項目的示例實現類。我正在使用同步上下文將進度更新編組到UI線程。在構造函數中,它獲取當前UI線程的上下文,以便它可以在後臺工作線程中用於提供狀態更新。

我也向你展示瞭如何取消正在運行的後臺工作者。

public partial class Form1 : Form 
{ 
    BackgroundWorker _worker = new BackgroundWorker(); 
    SynchronizationContext _syncContext; 

    public Form1() 
    { 
     InitializeComponent(); 
     _syncContext = SynchronizationContext.Current; 
    } 

    private void btnLoadForm_Click(object sender, EventArgs e) 
    { 
     _worker.WorkerReportsProgress = true; 
     _worker.WorkerSupportsCancellation = true; 
     _worker.DoWork += new DoWorkEventHandler(HandleDoWork); 
     _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(HandleWorkerCompleted); 
     _worker.ProgressChanged += new ProgressChangedEventHandler(HandleProgressChanged); 
     _worker.RunWorkerAsync(); 
    } 

    private void btnCancel_Click(object sender, EventArgs e) 
    { 
     if (_worker.WorkerSupportsCancellation) 
     { 
      _worker.CancelAsync(); 
     } 
    } 

    private void HandleDoWork(object sender, DoWorkEventArgs e) 
    { 
     // DO Any work to instantiate the form 
     System.Threading.Thread.Sleep(2000); 

     if (_worker.CancellationPending) 
     { 
      e.Cancel = true; 
     } 
     else 
     { 
      Form2 newForm = new Form2(); 
      newForm.ShowDialog(); 
     } 
    } 

    private void HandleProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // DO Progress Bar Updates Here 
     SendOrPostCallback callback = new SendOrPostCallback((o) => 
     { 
      label1.Text = "This is my Async content"; 
     }); 
     _syncContext.Send(callback, null); 
    } 

    private void HandleWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // DO Any completed step items here 
    } 

} 
+0

Rob Stewart先生,非常感謝.. – Qwerty