【发布时间】:2012-10-07 23:19:01
【问题描述】:
当我将 Visual Studio 2010 配置从“调试”更改为“发布”时,出现了一个非常奇怪的行为:
我有一个BackgroundWorker:_bg,在DoWork我有:
iswaiting = true;
_bg.ReportProgress(1, filePath);
while (iswaiting)
{
;
}
//My other part of code (EDIT: something do to with the `result` I get from the user.)
在ProgressChanged 中我有一个MessageBox,在用户交互之后,iswaiting 将被设置回 false,_bgDoWork 程序将继续。
void _bg_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//my other part of code........
result = Microsoft.Windows.Controls.MessageBox.Show("Question" ,"Title", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning);
iswaiting=false;
log(iswaiting.toString());
}
当我从 Visual Studio 运行它或在 Debug 模式下构建时,所有这些都非常有效,但是当我将它构建到 Release 时,我永远无法摆脱while(iswaiting) 循环,虽然我可以从日志中看到iswaiting 已经设置回false。
编辑:
我们非常欢迎更好的方法!
【问题讨论】:
-
Eeeep,你可能应该考虑一种不同的方法来实现这个 while 循环可能会占用 CPU
-
我在这里没有看到任何造成内存屏障的东西。调试限制了某些优化,在这种情况下不需要它,但发布版本需要它。
-
我知道这不是问题所在,但您还在等什么?您可以在更改进度的方法中执行您等待的代码。或者您可以在 BackgroundWorkerCompleted 事件中执行此操作。
-
@BenjaminDangerJohnson 从查看他的代码来看,他似乎在等待用户指示它应该继续还是提前停止,所以将
DoWork的其余部分移动到ProgressChanged或Completed可能不是正确的解决方案。 -
@BenjaminDangerJohnson 尝试取消的问题是,您不知道从弹出窗口到注意到取消,BGW 将处理多少。如果做“额外”的工作是可以的,那很好,但如果不是,那么你仍然面临等待的问题。
标签: c# visual-studio-2010 while-loop backgroundworker release