Bien qu'il s'agisse d'un vieux fil de discussion, je voulais attirer l'attention sur un problème que les développeurs peuvent rencontrer et qui m'a affecté et a rendu extrêmement difficile le débogage dans les grandes applications UWP. Dans mon cas, j'ai refait le code suivant à partir des suggestions ci-dessus en 2014, mais j'étais parfois confronté à des blocages occasionnels de l'application qui étaient de nature aléatoire.
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;
}
}
Dans ce qui précède, j'ai utilisé une classe statique pour permettre l'appel du Dispatcher à travers l'application - ce qui permet un appel unique. Dans 95 % des cas, tout allait bien, même en cas de régression de l'assurance qualité, mais les clients signalaient un problème de temps à autre. La solution a été d'inclure l'appel ci-dessous, sans utiliser d'appel statique dans les pages actuelles.
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
Ce n'est pas le cas lorsque je dois m'assurer que l'UI Thread a été appelé depuis App.xaml.cs ou mon Singleton NavigationService qui a géré le push/popping sur la pile. Le dispatcher perdait apparemment la trace de l'UI Thread appelé, puisque chaque page a son propre UI Thread, lorsque la pile avait une variété de messages déclenchés par le MessageBus.
J'espère que cela aidera d'autres personnes qui pourraient être affectées et c'est aussi là que je pense que chaque plateforme rendrait service à ses développeurs en publiant un projet complet couvrant les meilleures pratiques.