これは古いスレッドですが、開発者が遭遇する可能性のある問題に注意を向けたいと思いました。これは私に影響を与え、大規模な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を呼び出すことができ、1回の呼び出しが可能でした。95%の時間、QA回帰を行ってもすべてが正常でしたが、クライアントは時々問題を報告していました。解決策は、実際のページで静的呼び出しを使用せずに、以下の呼び出しを含めることでした。
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
これは、UIスレッドがApp.xaml.csまたはスタックへのプッシュ/ポップを処理するシングルトンNavigationServiceから呼び出されたことを確認する必要がある場合には当てはまりません。スタックにMessageBusからトリガーされるさまざまなメッセージがある場合、各ページには独自のUIスレッドがあるため、ディスパッチャはどのUIスレッドが呼び出されたかを追跡できなくなっていたようです。
これが影響を受ける可能性のある他の人に役立つことを願っています。また、ベストプラクティスをカバーする完全なプロジェクトを公開することで、各プラットフォームが開発者にサービスを提供すると思います。