簡體   English   中英

C#我應該創建一個或多個后台工作者?

[英]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.

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