C# 在一个BackgroundWorker上运行多个DoWork函数安全吗?
我正在使用一个已建立的代码库,我想将正在进行的一些工作转移到一个单独的线程。根据代码当前的结构方式,我希望执行以下操作:C# 在一个BackgroundWorker上运行多个DoWork函数安全吗?,c#,.net,multithreading,C#,.net,Multithreading,我正在使用一个已建立的代码库,我想将正在进行的一些工作转移到一个单独的线程。根据代码当前的结构方式,我希望执行以下操作: var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += firstFunctionToDoSomeWork; backgroundWorker.DoWork += secondFunctionToDoSomeWork; backgroundWorker.RunWorkerComplet
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += firstFunctionToDoSomeWork;
backgroundWorker.DoWork += secondFunctionToDoSomeWork;
backgroundWorker.RunWorkerCompleted += theWorkerCompletedFunction;
backgroundWorker.RunWorkerAsync();
我希望两个DoWork函数按顺序运行,firstFunctionToDoSomeWork
在启动secondFunctionToDoSomeWork
之前运行并完成。这样做安全吗?或者,当这两个函数没有按顺序运行时,我可能会遇到冲突吗?我想我想知道的是BackgroundWorker将如何处理第二个DoWork函数
谢谢
这样做安全吗
基本上,是的。因为DoWork是一个事件,所有事件都是“多播”
订阅事件的顺序很重要,因此每次创建一个新的Bgw是明智的
但是,您应该调查错误处理、取消和数据传递(结果和参数)在设置中的工作方式 您不应该依赖事件处理程序以特定顺序触发事件。在实际操作中,大多数实现都有一个已定义的顺序(最常见的是添加处理程序的顺序),但您无法确定任何特定事件的情况是否如此,事实上,它从未在事件的文档中明确定义,这意味着它会随着时间的推移而发生变化 大多数事件也会按顺序启动它们的处理程序,即使没有定义顺序,但不是全部。有些甚至同时解雇了他们的处理者。您可以非常自信,在这里不会发生这种情况,但在一般情况下,在为任意事件编写处理程序时,需要做好准备 如果顺序执行这两个函数对您很重要,那么您应该添加一个处理程序,并在该处理程序中调用这两个方法:
backgroundWorker.DoWork += (s, args) =>
{
firstFunctionToDoSomeWork(s,args);
secondFunctionToDoSomeWork(s,args);
};
您可以确定它将触发这两个事件。您无法确定他们是否会按预期顺序被解雇。OP特别提到了这两个处理程序的执行顺序很重要。OP还特别提到了DoWork事件。我敢说,你可以在BCL或其他标准库和平台中找到一个事件,它们不只是按顺序调用订阅者。当文档中没有提到它时,我会很高兴。我强烈抗议这里的任何删除。有人在互联网上做错了!!举证责任取决于提出索赔的人。说我不相信任何一个事件处理程序都有非标准的实现并不是在说什么,我也不相信所有的事件处理程序都有标准的实现。当有人说他们积极相信其中一种方式时,那实际上就是一种主张。因此,“您不能确定它们是否会按照预期的顺序被激发”不是一种说法,但“之前已经讨论过,处理程序的顺序是确定的”是一种说法。希望这能解决完全不相关的问题:)@HenkHolterman您不能声称事件的所有处理程序都将按特定顺序启动。您可以声明,在触发多播委托时,所有单独的方法都将按特定顺序执行,但无法确保任何给定事件都实现为多播委托,或者该事件的唯一实现是将所有添加/删除方法定向到相应的多播委托方法。一个非自动实现的事件可以随意添加/删除/触发它的处理程序。我在这里用两个以上的函数证明了这一点,并且看到它们不是按顺序执行的。。。