C# 闭包和BackgroundWorker事件处理程序
我定义了一个简单的BackgroundWorker,它对DoWork和RunWorkerCompleted事件处理程序使用闭包,分别设置和检查布尔值。简化后的代码(C#在.NET 3.5中)如下所示:C# 闭包和BackgroundWorker事件处理程序,c#,.net-3.5,closures,backgroundworker,C#,.net 3.5,Closures,Backgroundworker,我定义了一个简单的BackgroundWorker,它对DoWork和RunWorkerCompleted事件处理程序使用闭包,分别设置和检查布尔值。简化后的代码(C#在.NET 3.5中)如下所示: public void SomeMethod() { BackgroundWorker worker = new BackgroundWorker(); bool result = false; worker.DoWork +
public void SomeMethod()
{
BackgroundWorker worker = new BackgroundWorker();
bool result = false;
worker.DoWork += new DoWorkEventHandler(
(sender, e) =>
{
result = LengthyOperation();
});
worker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(
(sender, e) =>
{
AppendRunLog("Result: " + (result ? "PASS" : "FAIL"));
});
worker.RunWorkerAsync();
}
SomeMethod是从主UI线程上的WPF按钮处理程序调用的
通常情况下,这工作正常,但我经常会收到一个报告,说明操作在应该通过时失败(根据LengthyOperation内部生成的日志),即当操作在DoWork处理程序中应返回true时,布尔结果在已完成的处理程序中记录为false
我仔细检查并测试了LengthyOperation内部的代码,以确保其中没有任何细微的错误,我相当确信它是干净的。我无法在我的开发环境中复制它
我在设置和读取结果值的方式中是否有竞争条件?我希望分配操作在触发completed事件之前已经在DoWork中完成。看起来应该可以,假设
BackgroundWorker
基础结构确保存在适当的内存障碍
您确定不只是有两个并发操作,而且同时看到两组日志吗?在简化示例时,我省略了禁用按钮的部分,以便在操作完成之前无法再次触发操作。日志与此一致。我有一个将其转换为.NET4的辅助项目,我可能会出于学习体验的原因将后台工作人员转换为任务。谢谢你的精神检查。