我正在使用一个已建立的代码库,我想将一些正在完成的工作转移到一个单独的线程中。代码的当前结构方式我想做类似的事情:
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += firstFunctionToDoSomeWork;
backgroundWorker.DoWork += secondFunctionToDoSomeWork;
backgroundWorker.RunWorkerCompleted += theWorkerCompletedFunction;
backgroundWorker.RunWorkerAsync();
我希望这两个 DoWork 函数按顺序运行,firstFunctionToDoSomeWork
在 secondFunctionToDoSomeWork
开始之前运行并完成。这样做安全吗?或者当这两个函数没有按顺序运行时我可能会发生冲突吗?我想我想知道的是 BackgroundWorker 将如何处理第二个 DoWork 函数。
谢谢
最佳答案
您不应依赖事件处理程序以特定顺序由事件触发。在实际实践中,大多数实现都有一个定义的顺序(最常见的是添加处理程序的顺序),但您不能确定任何特定事件都是这种情况,而且实际上从未明确定义在事件的文档中,这意味着它会随着时间的推移而发生变化。
大多数事件也会按顺序触发它们的处理程序,即使未定义顺序,但不是全部。有些甚至同时解雇他们的处理程序。您可以确信这不会发生在这里,但在一般情况下, 是为任意事件编写处理程序时需要准备的事情。
如果按顺序执行这两个功能对您很重要,那么您应该添加一个 处理程序,并且在该处理程序中您应该调用以下两个方法:
backgroundWorker.DoWork += (s, args) =>
{
firstFunctionToDoSomeWork(s,args);
secondFunctionToDoSomeWork(s,args);
};
关于c# - 在单个 BackgroundWorker 上运行多个 DoWork 函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313884/