이것은 오래된 스레드이지만 개발자가 저에게 영향을 미치고 대규모 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, () =>
{
});
이는 UI 스레드가 App.xaml.cs 또는 스택에 대한 푸시 / 팝을 처리 한 내 Singleton NavigationService에서 호출되었는지 확인해야하는 경우가 아닙니다. 디스패처는 스택에 MessageBus에서 트리거되는 다양한 메시지가있을 때 각 페이지에 자체 UI 스레드가 있기 때문에 어떤 UI 스레드가 호출되었는지 추적하지 못하고있었습니다.
이것이 영향을받을 수있는 다른 사람들에게 도움이되기를 바라며 각 플랫폼이 모범 사례를 다루는 전체 프로젝트를 게시하여 개발자에게 서비스를 제공 할 것이라고 생각합니다.