2015-09-11 49 views
0

多个(实际上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(); 

我在使机器视觉应用程序出现一些问题,这使我疯了。

感谢

+0

为什么你需要BW2和BW3,如果他们的DoWork是空的?你没有注册工作让他们执行......全部都在bw1中。顺便说一下,var bw2上的小错字 - > var bw3。 – Malkaviano

+0

拍摄,你是对的。这是一个错字。它应该是bw1.DoWork bw2.DoWork等等......我的错误对不起 – WBuck

+0

它完全取决于DoingStuff_DoWork的内容......根据内容会告诉你是否可以有多个线程同时执行该代码。 –

回答

0

是的,你可以做到这一点你有当工人运行无法控制。

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

+0

我希望我可以说服我们的技术总监移动到.Net 4的确切原因。 Id waaaaaay宁愿使用比使用线程更多的任务... – WBuck

0

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

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

你在同一时间线程不点火的问题已经在这里找到答案 Thread not run immediately when using more than 4 BackgroundWorker

+0

每个DoWork事件都传递一个唯一的键值,因此确定我所在的线程不是太困难。我最大的问题是,并非所有线程都在相同(甚至接近)的时间点击。 – WBuck

+0

您的问题线程不同时触发已在这里回答http://stackoverflow.com/questions/29142664/thread-not-run-immediately-when-using-more-than-4-backgroundworker –

+0

@ AceK47 I更新了我的回答,对你有帮助吗? –