繁体   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