Приложение моего UWP работает в режиме декомпрессии и отлично работает в режиме отладки, но я не могу сказать, в чем проблема, но я знаю, что это связано с комбинация поднятия события из System.Threading.Timer и MVVMLight.Ошибка приложения UWP Windows 10 в режиме деблокирования, но отлично работает в режиме отладки
Я создал новое фиктивное приложение и использовал тот же код (ZXing.net.mobile, где я использовал 2 портативные библиотеки, и я использовал свой собственный пользовательский элемент управления, который является упрощенной версией их). Я использую события вместо <Action>
). Это прекрасно работает, и я в настоящее время пытаюсь внести в него больше шагов, то есть включить mvvmlight и навигацию, но до сих пор я не могу воспроизвести проблему в этом фиктивном приложении.
Ошибка я получаю:
Unhandled exception at 0x58C1AF0B (mrt100_app.dll) in Company.MyApp.App.exe:
0xC0000602: A fail fast exception occurred. Exception handlers will not be
invoked and the process will be terminated immediately.
Последовал:
Unhandled exception at 0x0107D201 (SharedLibrary.dll) in
Company.MyApp.App.exe: 0x00001007.
При взгляде на окно Threads, один из рабочего потока имеет следующую информацию, если это помощь.
Not Flagged > 4012 0 Worker Thread <No Name>
System.Private.Interop.dll!System.Runtime.InteropServices.
ExceptionHelpers.ReportUnhandledError Normal
[External Code]
System.Private.Interop.dll!System.Runtime.InteropServices.ExceptionHelpers.
ReportUnhandledError(System.Exception e) Line 885
System.Private.Interop.dll!Internal.Interop.InteropCallbacks.ReportUnhandledError
(System.Exception ex) Line 17
System.Private.WinRTInterop.CoreLib.dll!Internal.WinRT.Interop.WinRTCallbacks.
ReportUnhandledError(System.Exception ex) Line 274
System.Private.CoreLib.dll!System.RuntimeExceptionHelpers.ReportUnhandledException
(System.Exception exception) Line 152
System.Private.Threading.dll!System.Threading.Tasks.AwaitTaskContinuation.
ThrowAsyncIfNecessary(System.Exception exc) Line 784
System.Private.Threading.dll!System.Threading.WinRTSynchronizationContext.Invoker.
InvokeCore() Line 182
System.Private.Threading.dll!System.Threading.WinRTSynchronizationContext.Invoker.
Invoke(object thisObj) Line 162
System.Private.CoreLib.dll!System.Action<System.__Canon>.
InvokeOpenStaticThunk(System.__Canon obj)
System.Private.WinRTInterop.CoreLib.dll!Internal.WinRT.Interop.WinRTCallbacks.PostToCoreDispatcher.AnonymousMethod__0() Line 266
MyCompany.MyApp.App.exe
MyCompany.MyApp.App.ViewModels.ValidateHandler.Invoke(string pin)
MyCompany.MyApp.App.McgInterop.dll!McgInterop.ReverseComSharedStubs
.Proc_(object __this, System.IntPtr __methodPtr) Line 6163
MyCompany.MyApp.App.McgInterop.dll!Windows.UI.Core.DispatchedHandler__Impl.Vtbl.Invoke__STUB(System.IntPtr pComThis) Line 45147
[External Code]
В моей QR Code UserControl, он использует System.Threading.Timer и это вызывает событие, когда QR-код будет найден:
timerPreview = new Timer(async (state) =>
{
....
// Check if a result was found
if (result != null && !string.IsNullOrEmpty(result.Text))
{
Debug.WriteLine("Barcode Found: " + result.Text);
if (!this.ContinuousScanning)
{
delay = Timeout.Infinite;
await StopScanningAsync();
}
else
{
delay = this.ScanningOptions.DelayBetweenContinuousScans;
}
OnBarcodeFound(result.Text);
}
timerPreview.Change(delay, Timeout.Infinite);
}, null,
this.ScanningOptions.InitialDelayBeforeAnalyzingFrames,
Timeout.Infinite);
На странице, которая у себя QRCode UserControl, я «ве получил следующий код:
private async void ScannerControl_BarcodeFound(string barcodeValue)
{
var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => {
Debug.WriteLine(barcodeValue);
GetViewModel.BarcodeFound(barcodeValue);
});
}
Как вы можете видеть, я передаю значение QRcode моего ViewModel и оттуда, я послал сообщение, а затем перенаправлять на другую страницу:
public void BarcodeFound(string barcodeData)
{
Messenger.Default.Send<string>(barcodeData, MessengerTokens.QrCodeFound);
this.NavigationFacade.NavigateToMyOtherPage();
}
Я мог бы продолжать и предоставлять дополнительный код, но поскольку я добавляю дополнительные точки останова, я вижу, что код и передача правильного значения и переход в правильное место, но в итоге он выдает эту ошибку. Если я добавлю дополнительные обработчики ошибок или код диспетчера, он в конечном итоге работает и переходит на следующую страницу, как ожидалось, но когда я нажимаю кнопку в моем CommandBar, это занимает некоторое время, и в итоге она вызывает ту же ошибку, поэтому добавив эти дополнительные биты кода, я чувствую, что я просто сжимаю проблему дальше по линии.
У кого-нибудь есть предложения по поводу того, как я обойду эту проблему. Мне жаль, что я не могу поделиться полным приложением, но определенно не могу. Поэтому я знаю, что будет сложно предоставить решение, но если у кого-то есть предложения, я буду благодарен им.
Как я уже сказал, проблема связана с комбинацией потоков и mvvmlight, но это заставляет меня гадать, что мое тестовое приложение работает так, как ожидалось, поэтому я уверен, что это не Zxing или мой UserControl.
Любая помощь, предложения были бы оценены или если вам нужно предоставить дополнительную информацию, пожалуйста, сообщите мне, что и я постараюсь предоставить.
Спасибо.
Возможно, это проблема, связанная с .NET. Собственный скомпилированный код, используемый в relase? Вы пробовали отладку с включенной «Компиляцией с цепочкой инструментов .NET?»? – Plac3Hold3r
Привет, я уже пробовал это, и я также попробовал его с выбранным «Оптимизировать код» и до сих пор не сбой в режиме отладки. – Thierry