C # Отладка сборки в порядке, но сборка выпуска не удалась из-за оптимизации - PullRequest
0 голосов
/ 13 июня 2018

Похоже, из-за оптимизации компилятора :(. 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)

работает при сборке "Debug", но цикл "вечно" при "Release""построить.Если добавить Trace.WriteLine в цикл while, это тоже работает.Какой правильный подход для ее решения?

Нет, ожидайте / асинхронно, потому что совместим с WinXP (.NET 4.0)

1 Ответ

0 голосов
/ 13 июня 2018

Если вам нужно заблокировать выполнение до тех пор, пока делегат не будет выполнен в каком-либо другом потоке, тогда реализация правильной синхронизации - это ключ.

Например, вы можете использовать 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);    
...