2012-11-13 52 views
0

我有我需要做一些工作的文件(小工具)的列表。我想以異步的方式做到這一點,所以我的界面保持響應。我想用進度更新UI。這是我的原型代碼。我該如何做到這一點?我假設我需要利用線程,但我也不想同時跨越所有線程,一個接一個都沒問題。如何編寫窗口小部件的異步處理?

void Process() 
{ 
    var documents = GetDocuments(); 
    foreach(document in documents) 
    { 
     ProcessDocument(
     document, 
     status => this.TextBox.Text += status); 
    } 
} 

void ProcessDocument(Document document, Action<string> onCompleted) 
{ 
} 

回答

1

您可以使用BackgroundWorker class來處理Windows Forms項目中的異步操作。

BackgroundWorker worker = new BackgroundWorker(); 
worker.WorkerReportsProgress = true; 
worker.DoWork += (sender, args) => { 
    var documents = GetDocuments(); 
    foreach(var document in documents) 
    { 
     ProcessDocument(document); 
     worker.ReportProgress(0, status); 
    } 
}; 
worker.ProgressChanged += (sender, args) => { 
    this.TextBox.Text += args.UserState.ToString(); 
}; 
worker.RunWorkerAsync(); 
+0

BackgroundWorker已棄用,以支持基於任務的編程 – LMB

+0

@LMB您在哪裏閱讀過? BackGroundWorker上的MSDN頁面沒有提到這一點。順便說一下,我同意你的看法,TPL是Frameworks 4及更高版本的最佳方法。 –

+0

@PanosRontogiannis我會嘗試找到確切的頁面,但我記得它在MSDN中,在關於任務名稱空間任務用法的頁面之一中。 – LMB

1

可以使用System.Threading.Thread

記住,你需要使用代表安全更新中比其他運行時 你不能修改控制你的UI控件主UI線程。

如果你想這樣做很容易沒有代表,因爲你認爲你可以控制它 您可以設置該屬性

Control.CheckForIllegalCrossThreadCalls=false 

那麼你將被允許在沒有非法橫線檢查,以更新控制

如果你喜歡使用的BackgroundWorker類,這讓你綁定和事件稱爲 ProgressChanged,使您可以更新UI太

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
    //thread work 
    } 

    // This event handler updates the UI 
    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // Update the UI here 

    } 
0

Framework 4.5引入了簡化異步.NET編程的async/await關鍵字。

看一看TPL如果你如果是另一種使用的是早期版本的.NET 3.5(及以上),那麼你應該看看APM使用框架4.

相關問題