C# 调试构建正常,但由于优化,发布构建失败



这似乎是由于编译器优化:(.net 4.0, VS2015(, 这是触摸屏的后台工作程序。

DispatchService.BeginInvoke(() =>
{
_vm = new TouchViewModel(Container.GetExportedValue<ITouchView>());
_vm.ShowDialog();
});
// the background worker waiting for the Dialog show up
while (_vm == null) ; // Trace.WriteLine($"Wait _vm");
// Get Packet from Touch Panel
_vm.Points.Add(packet);
// (draw on the dialog via data binding)

它在"调试"版本中工作,但在"发布"版本中永久循环。 如果在while循环中添加Trace.WriteLine,它也可以工作。 解决它的正确方法是什么?

没有等待/异步,因为与WinXP兼容(.NET 4.0(

如果您需要阻止执行,直到委托将在其他线程中执行,那么实现正确的同步是一个关键。

例如,您可以使用Monitor

// field somewhere
readonly object _lock = new object();
// then
DispatchService.BeginInvoke(() =>
{
_vm = new TouchViewModel(Container.GetExportedValue<ITouchView>());
lock(_lock)
Monitor.Pulse(_lock);
_vm.ShowDialog();
});
lock(_lock)
Monitor.Wait(_lock);