似乎是由于编译器优化:(。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)
它适用于&#34; Debug&#34;构建,但永远循环在&#34;发布&#34;建立。 如果在while循环中添加Trace.WriteLine,它也可以。 解决问题的正确方法是什么?
答案 0 :(得分:1)
如果你需要阻止执行,直到委托将在其他一些线程中执行,那么实现正确的同步就是关键。
例如,您可以使用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);