2011-03-03 20 views
2

比方說,我在C#中的以下功能:C#:如何做基本BackgroundWorkerThread

void ProcessResults() 
{ 
    using (FormProgress f = new FormProgress()) { 
     f.ProgressAmount = 10; 
     // I want to have the following line run in a BackgroundWorkerThread 
     RetrieveAndDisplayResults(); 
     f.ProgressAmount = 100; 
    } 
} 

什麼會我需要行RetrieveAndDisplayResults();做在BackgroundWorkerThread?

+2

的http:// MSDN。 microsoft.com/en-us/library/hybbz6ke.aspx – 2011-03-03 11:32:23

回答

3
var f = new FormProgress() 

f.ProgressAmount = 10; 
var worker = new BackgroundWorker(); 
worker.DoWork += (o, e) => RetrieveAndDisplayResults(); 
worker.RunWorkerCompleted += (o, e) => 
{ 
    f.ProgressAmount = 100; 
    f.Close(); 
} 

worker.RunWorkerAsync(); 

要運行如果您的方法正在更新UI,則必須將其更改爲返回結果,然後將其顯示在工作人員的RunWorkerCompleted事件中。

您還可以使用ProgressChanged事件和ReportProgress方法來獲得更多粒度進度更新。

+1

這並沒有考慮到'f.ProgressAmount'被設置在工作者之外,因此會直接跳到100,然後被放置,可能在'RetrieveAndDisplayResults( )'甚至被調用。 – 2011-03-03 11:35:37

2

您目前的方法不適合使用線程(Bgw或其他)。

主要問題是在設置進度= 100之前的「等待」部分。這個方法在那個時候應該做什麼?

您可以反轉邏輯,啓動Bgw並使用「進度」和「已完成」事件進行更新。關閉你的表格。

1

你可能會改變你的做法,但下面的代碼應該能夠給出一個腳手架長時間運行的任務,因爲它的進展是更新UI:

private void LaunchWorker() 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(OnDoWork); 
    worker.ProgressChanged += new ProgressChangedEventHandler(OnProgressChanged); 
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OnRunWorkerCompleted); 

    worker.RunWorkerAsync(); 
} 

void OnDoWork(object sender, DoWorkEventArgs e) 
{ 
    var worker = sender as BackgroundWorker; 

    while (aLongTime) 
    { 
     worker.ReportProgress(percentageDone, partialResults); 
    } 

    e.Result = results; 
} 

void OnProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    var progress = e.ProgressPercentage; 
    var partialResults = e.UserState; 

    // Update UI based on progress 
} 

void OnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var results = e.Result; 

    // Do something with results 
}