Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#调试构建正常,但发布构建失败,原因是优化了_C#_Wpf_Debugging_Release - Fatal编程技术网

C#调试构建正常,但发布构建失败,原因是优化了

C#调试构建正常,但发布构建失败,原因是优化了,c#,wpf,debugging,release,C#,Wpf,Debugging,Release,这似乎是由于编译器优化:(.net 4.0,VS2015), 这是一个触摸面板的后台工作程序 DispatchService.BeginInvoke(() => { _vm = new TouchViewModel(Container.GetExportedValue<ITouchView>()); _vm.ShowDialog(); }); // the background worker waiting for the Dialog show up whi

这似乎是由于编译器优化:(.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)
DispatchService.BeginInvoke(()=>
{
_vm=新的TouchViewModel(Container.GetExportedValue());
_vm.ShowDialog();
});
//等待对话框显示的后台工作人员
while(_vm==null);//Trace.WriteLine($“Wait_vm”);
//从触摸屏获取数据包
_vm.Points.Add(数据包);
//(通过数据绑定在对话框上绘制)
它在“调试”构建时工作,但在“发布”构建时永远循环。 如果在while循环中添加Trace.WriteLine,它也可以工作。 解决这个问题的正确方法是什么


没有等待/异步,因为WinXP兼容(.NET 4.0)如果需要阻止执行,直到委托将在其他线程中执行,那么实现正确的同步是关键

例如,您可以使用:

//某处的字段
只读对象_lock=新对象();
//然后
DispatchService.BeginInvoke(()=>
{
_vm=新的TouchViewModel(Container.GetExportedValue());
锁
监视器脉冲(锁定);
_vm.ShowDialog();
});
锁
监视器。等待(_lock);

您想做什么<代码>while(_vm==null)是一种灾难性的方法。如果代码看起来有点糟糕,那么您正在调度调用来实例化一个对象,并在一个紧密的循环中等待它返回。可能是调试代码的计时使其能够工作。为什么不在
中使用
while(true){}
\u vm
,而(\u vm==null)
循环可能正在注册。有一系列的黑客可以避免这个问题-从
volatile
lock
Thread.volatireead
,等等-但坦率地说,这是一个丑陋的事情,首先要做的…尝试
而(volatile.Read(ref\u vm)==null)但是整个忙循环确实不好。最好使用
ManualResetEvent
,在分配
\u vm
时设置它,并等待事件而不是
while
循环。我以为您想等待对话框关闭,但在您的问题编辑中,您似乎只想在显示对话框时执行一些代码(您是在等待对话框出现还是只等待
\u vm
初始化?)。如果是这样,那么可能更好的解决方案是订阅事件,例如加载
并在那里运行代码。嗨,Sinatr,你明白我的目的了。我使用MVVM,那些源代码在应用程序程序集中,而不是演示程序集中,所以应该可以。谢谢你的评论!最后我使用ManualResetEventSlim
// 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);