[英]C# should I create one Background worker or many?
我是那些偶然的程序員之一,所以我對編程最佳實踐知之甚少。
我有一個目前使用4 Background Worker的應用程序。
所以我宣布他們:
private BackgroundWorker bw1;
private BackgroundWorker bw2;
private BackgroundWorker bw3;
private BackgroundWorker bw4;
然后配置它們:
bw1 = new BackgroundWorker();
bw1.WorkerReportsProgress = true;
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
bw1.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw2 = new BackgroundWorker();
bw2.WorkerReportsProgress = true;
bw2.DoWork += new DoWorkEventHandler(bw2_DoWork);
bw2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw2_RunWorkerCompleted);
bw2.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw3 = new BackgroundWorker();
bw3.WorkerReportsProgress = true;
bw3.DoWork += new DoWorkEventHandler(bw3_DoWork);
bw3.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw3_RunWorkerCompleted);
bw3.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw4 = new BackgroundWorker();
bw4.WorkerReportsProgress = true;
bw4.DoWork += new DoWorkEventHandler(bw4_DoWork);
bw4.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw4_RunWorkerCompleted);
bw4.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
然后我使用bw1.RunWorkerAsync(),bw2.RunWorkerAsync()等等......
事情是我從來沒有同時打電話給他們,他們是以一種非常線性的方式在不同的地方打電話。
所以我的問題是,擁有許多“預先配置”的后台工作者或擁有一個並根據我的目的更改DoWork和RunWorkerCompleted事件是否更好?
通常我會以完全不同的模式使用后台工作者。 我不是一開始就一次定義它們,包括它們各自的事件處理程序,而是在我做一些需要它的東西時動態創建它們。
public void SomeEventHandlerMaybe(object sender, EventArgs e) {
// do something
var bw = new BackgroundWorker();
bw.ReportsProgress = true;
bw.DoWork += delegate {
// do work. You can use locals from here
};
bw.ProgressChanged += delegate { ... };
bw.RunWorkerCompleted += delegate {
// do something with the results.
};
bw.RunWorkerAsync();
}
這樣的事情。 它的好處是,您可以在一個地方使用所有代碼或在后台工作程序中執行某些操作,並且大致按正確順序執行。
從架構的角度來看,最好為每個后台任務都有一個單獨的后台工作程序,這在邏輯上與該類的另一個任務無關。
通常,如果有助於在系統上使用更有效的資源,則使用多個線程是合理的。 對於CPU密集型任務,每個CPU核心一個線程是一個很好的起點。 對於IO密集型任務,您當然可以擁有更多。
如果您可以靈活地使用.NET 4,我會查看Task Parallel Library而不是BackgroundWorker。 默認情況下,除了提供更簡單的編程模型之外,它還會為您做出相對明智的決策,以確定並發運行多少個線程。
使用BackgroundWorker進行處理意味着您可以在單獨的線程中執行此操作。 因此,如果您不需要多線程,則不需要單獨的后台工作人員。 如果您在啟動每個工人后等待完成,那么您只能擁有一名工人。 它也可能會刪除一些代碼重復...
為了某些計算目的,你運行工人。 如果使用一個調用的計算或以任何方式取決於另一個調用,您可以使用多個工作者,以獲得更好的性能(順便說一下,這也是測量的主題)。 如果您只需要完成4個作業,並且只是為了不阻止主UI而在單獨的線程中運行它們,那么一個工作人員就是非常好的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.