【问题标题】:Background worker questions后台工作人员问题
【发布时间】:2015-12-07 11:11:56
【问题描述】:

多个(实际上是 19 个)后台工作人员可以都使用同一个 DoWork 事件吗?这有问题吗?

var bw1 = new BackgroundWorker();
bw1.DoWork += DoingStuff_DoWork;
var bw2 = new BackgroundWorker();
bw2.DoWork += DoingStuff_DoWork;
var bw2 = new BackgroundWorker();
bw3.DoWork += DoingStuff_DoWork;

我的下一个问题是,如果我在每个后台工作人员上调用 RunWorkerAsync,它们会同时启动吗?

bw1.RunWorkerAsync();
bw2.RunWorkerAsync();
bw3.RunWorkerAsync();

我在使用机器视觉应用程序时遇到了一些问题,这让我抓狂。

谢谢

【问题讨论】:

  • 如果 bw2 和 bw3 的 DoWork 为空,为什么还需要它们?你没有注册工作让他们执行......这一切都在 bw1 中。顺便说一句,var bw2 -> var bw3 上的小错字。
  • 开枪,你是对的。那是一个错字。它应该是 bw1.DoWork bw2.DoWork 等等......我的错误对不起
  • 这完全取决于DoingStuff_DoWork 的内容...取决于里面的内容会告诉你是否可以让多个线程同时执行该代码。
  • 我想知道我是否需要直接开始使用线程来获得我想要的结果。我只是喜欢使用 backgroundworker 提供的一点额外抽象。

标签: c# multithreading winforms .net-3.5 backgroundworker


【解决方案1】:

是的,你可以有多个BackgroundWorker DoWork 来执行相同的功能。请记住,每个 DoWork 事件都是在单独的线程上调用的,因此您可能会遇到线程问题,例如数据竞争、死锁或活锁。

此外,使用相同的函数也会使调试变得更加困难,就好像在函数的某处放置断点一样,您需要确定哪个线程触发事件。因此,除非函数相对简单,否则我建议您将 DoWork 事件挂钩到不同的事件处理程序,将通用代码放入一个函数并在事件函数中调用它。

您的线程未同时触发的问题已在此处得到解答 Thread not run immediately when using more than 4 BackgroundWorker

【讨论】:

  • 每个 DoWork 事件都传递了一个唯一的键值,因此确定我在哪个线程中并不太难。我最大的问题是,并非所有线程都在相同(甚至关闭)时间触发。
  • 您的线程未同时触发的问题已在此处得到解答stackoverflow.com/questions/29142664/…
  • @AceK47 我更新了我的答案,对你有帮助吗?
【解决方案2】:

是的,您可以这样做但是您无法控制工作人员何时运行。

您可能需要重新设计和使用TPL,它更适合您的需求。

【讨论】:

  • 我希望我能说服我们的技术总监出于这个确切原因升级到 .Net 4。 Id waaaaaay 宁愿使用任务而不是使用线程......
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多