簡體   English   中英

我是否需要實施后台工作者

[英]Do I need to implement a background worker

我有一個主要的GUI應用程序,它在引用的程序集中完成所有的實際工作。 現在,我不從事后台工作,因此在處理過程中它基本上鎖定了主UI。 在我引用的匯編中,我添加了很多事件以將不同的進度報告回主UI表單。 在主UI窗體上,我使用這些事件的值更新了不同的文本框。 我的問題是,首先,拋出這些事件時處理似乎要慢得多。 那么我應該在輔助線程上觸發事件(來自引用的程序集)嗎? 我最初對被引用(靜態)的調用是否應該通過后台工作人員進行? 我想在一個單獨的線程中報告不同類型的進度,只是不確定要采用哪種方法才能獲得最佳性能。

謝謝

從您的描述看來,您將從多線程中受益,因為它將有助於使UI保持響應。

最簡單的方法是使用BackgroundWorker。 首先處理大量示例之一 ,然后硬着頭皮,如果有任何問題,請回到此處。

回應評論:

從BackgroundWorker工作程序線程與主線程進行通信的最佳方法是調用BackgroundWorker.ReportProgress方法,該方法帶有一個可選的對象參數userState ,可用於打包要通信的數據。

這將導致在主線程上引發BackgroundWorker.ProgressChanged事件-無需顯式的Invoke即可處理數據。

如果您已經實現了事件,則必須做一些重做以調用ReportProgress而不是引發事件,或者實現某種適配器來處理事件並將其路由到ReportProgress方法調用。

您可以在其他線程上啟動您的進程(另一個程序集上的方法),並在主窗體上處理由它引發的事件。

由於UI不能被另一個線程更新,因此應該將這些事件的代碼包裝在this.Invoke()上。

例如:

private void TheEventRaisedOnAnotherThread(object sender, EventArgs e)
{
    _counter++;
    this.Invoke(new MethodInvoker(delegate() { TextBox1.Text = _counter.ToString(); }));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM