虽然这是一个旧线程,但我想提请注意开发人员可能遇到的一个可能的问题,该问题影响了我并使得在大型 UWP 应用程序中调试变得极其困难。就我而言,我在 2014 年从上述建议中重构了以下代码,但偶尔会受到本质上随机的应用程序冻结的困扰。
public static class DispatcherHelper
{
public static Task RunOnUIThreadAsync(Action action)
{
return RunOnUIThreadAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, action);
}
public static async Task RunOnUIThreadAsync(Windows.UI.Core.CoreDispatcherPriority priority, Action action)
{
try
{
await returnDispatcher().RunAsync(priority, () =>
{
action();
});
}
catch (Exception ex)
{
var noawait = ExceptionHandler.HandleException(ex, false);
}
}
private static Windows.UI.Core.CoreDispatcher returnDispatcher()
{
return (Windows.UI.Xaml.Window.Current == null) ?
CoreApplication.MainView.CoreWindow.Dispatcher :
CoreApplication.GetCurrentView().CoreWindow.Dispatcher;
}
}
从上面看,我使用了一个静态类来允许在整个应用程序中调用 Dispatcher - 允许一次调用。在 95% 的时间里,即使通过 QA 回归,一切都很好,但客户会时不时地报告问题。解决方案是包含下面的调用,而不是在实际页面中使用静态调用。
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
当我需要确保从 App.xaml.cs 或我的 Singleton NavigationService 调用 UI 线程时,情况并非如此,后者处理推送/弹出到堆栈。当堆栈有各种从 MessageBus 触发的消息时,调度程序显然正在丢失调用哪个 UI 线程的跟踪,因为每个页面都有自己的 UI 线程。
希望这可以帮助其他可能受到影响的人,而且我认为每个平台都会通过发布一个涵盖最佳实践的完整项目来为他们的开发人员提供服务。