说明(.Net framework 3.5/Windows7/VS12): 1)Operation是一种可以异步运行的类型。它通过名为 Executed 的事件通知其他对象,如下所示:
_Operation.Executed += OperationExecuted;
2) 在这个事件中,我们调用 StopProgress() 如下:
private void OperationExecuted (object sender, OperationEventArgs e)
{
StopProgress();
}
3) StopProgress() 如下所示:
public void StopProgress()
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(StopProgress));
return;
}
lblTemp.Text = "operation complete. ";// 1
//progressBar1.Visible = false; // 2
// with added locks the app totally hangs
//lock (progressBar1)
//{
// progressBar1.Visible = false;
//}
}
当注释标记为“1”的行(在 StopProgress() 内)和取消注释“2”(这是所需的行为)时,我们偶尔会遇到竞速条件(运行应用程序 5-10 次后,我们会遇到竞速条件)。使用“1”行,它永远不会发生。也没有抛出异常(捕获/未捕获)。我们假设问题与“ProgressBar”本身有关。如果没有,这里可能是什么情况。任何关于如何追踪比赛条件(易受攻击的代码部分)的建议也非常感谢。谢谢。