gpt4 book ai didi

c# - 发布和调试之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 21:09:43 24 4
gpt4 key购买 nike

当我将 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 并且 _bg DoWork 程序将继续。

 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

编辑:

非常欢迎更好的方法!!

最佳答案

这可能是由于线程优化。为了在 Release模式下安全地“查看”iswaiting 中的更改,您需要适当的内存屏障。

“修复”此问题的最简单方法是将 iswaiting 标记为 volatile :

volatile bool iswaiting;

也就是说,像这样“旋转”会完全消耗一个 CPU 内核。更好的方法是使用 ManualResetEvent 来表示您可以继续。

// Add:
private ManualResetEvent allowProgress = new ManualResetEvent(false);

然后,您可以不使用 iswaiting,而是:

_bg.ReportProgress(1, filePath);
allowProgress.WaitOne(); // This will block until it's set

要让它继续,请使用:

 result = Microsoft.Windows.Controls.MessageBox.Show("Question" ,"Title", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning);

allowProgress.Set();

这里的好处是你不会在阻塞时消耗 CPU,你也不必自己担心内存障碍。

关于c# - 发布和调试之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12938732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com