【发布时间】:2018-06-13 10:18:19
【问题描述】:
似乎是由于编译器优化:(.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)
【问题讨论】:
-
你想做什么?
while (_vm == null) ;是灾难的秘诀 -
该代码看起来有点讨厌,您正在调度调用以实例化一个对象并在一个紧密的循环中等待它返回。可能是调试代码的时间允许它工作。
-
为什么不使用
while (true) { }? -
while (_vm == null)循环中的_vm可能正在注册。有一系列技巧可以避免这个问题 - 从volatile、lock、Thread.VolatileRead等 - 但坦率地说,这首先是一件丑陋的事情...... -
试试
while (Volatile.Read(ref _vm) == null) ;,但这整个忙循环真的不好。最好使用ManualResetEvent,在分配_vm时设置它,然后等待事件而不是while循环。