c# - 在单个 BackgroundWorker 上运行多个 DoWork 函数是否安全?

标签 c# .net multithreading

我正在使用一个已建立的代码库,我想将一些正在完成的工作转移到一个单独的线程中。代码的当前结构方式我想做类似的事情:

var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += firstFunctionToDoSomeWork;
backgroundWorker.DoWork += secondFunctionToDoSomeWork;
backgroundWorker.RunWorkerCompleted += theWorkerCompletedFunction;
backgroundWorker.RunWorkerAsync();

我希望这两个 DoWork 函数按顺序运行,firstFunctionToDoSomeWorksecondFunctionToDoSomeWork 开始之前运行并完成。这样做安全吗?或者当这两个函数没有按顺序运行时我可能会发生冲突吗?我想我想知道的是 BackgroundWorker 将如何处理第二个 DoWork 函数。

谢谢

最佳答案

您不应依赖事件处理程序以特定顺序由事件触发。在实际实践中,大多数实现都有一个定义的顺序(最常见的是添加处理程序的顺序),但您不能确定任何特定事件都是这种情况,而且实际上从未明确定义在事件的文档中,这意味着它会随着时间的推移而发生变化。

大多数事件也会按顺序触发它们的处理程序,即使未定义顺序,但不是全部。有些甚至同时解雇他们的处理程序。您可以确信这不会发生在这里,但在一般情况下, 是为任意事件编写处理程序时需要准备的事情。

如果按顺序执行这两个功能对您很重要,那么您应该添加一个 处理程序,并且在该处理程序中您应该调用以下两个方法:

backgroundWorker.DoWork += (s, args) => 
{
    firstFunctionToDoSomeWork(s,args);
    secondFunctionToDoSomeWork(s,args);
};

关于c# - 在单个 BackgroundWorker 上运行多个 DoWork 函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25313884/

相关文章:

Java wait() 和 notify() 无法正常工作

java - Java中的多线程

c# - C# 构建的 .exe 是否可以 self 删除?

c# - 如何使用 LINQ 创建条件 where 子句

c# - ViewBag 检测最后一项 MVC

c# - ItemsControl 文本框名称在 .cs 文件中不起作用

c# - 在线程中使用 C# 将字符串添加到 WPF 中的列表框

c# - 通过属性及其值获取属性名称

c# - 如何在 Fluent NHibernate 上设置 SysCache?

.net - ASP.NET Webforms + ASP.NET Ajax与ASP.NET MVC和Ajax框架的自由