为啥 Windows 10 UWP 应用程序由于调用了为不同线程编组的接口而崩溃?

Posted

技术标签:

【中文标题】为啥 Windows 10 UWP 应用程序由于调用了为不同线程编组的接口而崩溃?【英文标题】:why windows 10 UWP app is crashing due to The application called an interface that was marshalled for a different thread?为什么 Windows 10 UWP 应用程序由于调用了为不同线程编组的接口而崩溃? 【发布时间】:2019-03-19 21:26:06 【问题描述】:

我有一个 Windows 10 UWP 应用程序和曲棍球应用程序 SDK 集成在其中。我无法找到应用程序崩溃的确切原因。我正在提供 Hockey 应用程序崩溃日志,请帮助我解决问题。

这是在第一次安装和打开应用程序后发生的。 从下一次开始,应用程序正在打开并且没有崩溃并且工作正常。

以下是曲棍球应用程序崩溃日志。

Microsoft.HockeyApp.Extensibility.Windows.UnhandledExceptionTelemetryModule.CoreApplication_UnhandledErrorDetected(Object sender, ApplicationModel.Core.UnhandledErrorDetectedEventArgs e)

应用特定信息:

The application called an interface that was marshalled for a different thread. (Excep_FromHResult 0x8001010E)

异常堆栈:

Binary Images:
0x00007ffc23610000-0x00007ffc2500d000+Win.Appunknown<039259f40c314ebda8ccf39e237ab5c01>D:\xxx\xx\xx\Win.App\obj\x64\Staging\ilc\intermediate\Native\Win.App.pdb.

提前致谢。

【问题讨论】:

在VS中开启“break on first chance exceptions”,你应该会发现你的错误。很可能您有一个在后台线程上调用的事件处理程序,并且您正在尝试更新处理程序中的某些 XAML UI(或绑定到 UI 的 ViewModel)。如果是这样,只需使用Dispatcer.RunAsync(…) 运行您的代码。 【参考方案1】:

你必须在 UI Thread 中调用你的方法。

这解决了我的问题:

        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        
           //Run Your code Here
        );

【讨论】:

曲棍球应用程序崩溃日志没有给出崩溃发生的任何方法。我必须在 UI 线程中调用哪种方法。 so,看看什么方法直接与 UI 交互(例如更改代码中的一些文本或图片) 查看危险或使用MainView回复this question。

以上是关于为啥 Windows 10 UWP 应用程序由于调用了为不同线程编组的接口而崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Windows 10 uwp 上的代码重新启动

带或不带Fluent设计系统的UWP应用程序(取决于Windows 10的版本)

如何更改 windows uwp图标

UWP -- Background Task 深入解析

Windows 10 UWP程序标题栏设置

如何在 UWP 中声明 Haptic 类(VibrationDevice)的权限?