Si bien este es un hilo antiguo, quería llamar la atención sobre un posible problema que los desarrolladores pueden encontrar, lo que me impactó y dificultó enormemente la depuración en aplicaciones de UWP grandes. En mi caso, refactoricé el siguiente código de las sugerencias anteriores en 2014, pero ocasionalmente estaba plagado de congelamientos ocasionales de aplicaciones que eran de naturaleza aleatoria.
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;
}
}
De lo anterior, había usado una clase estática para permitir la llamada del Dispatcher en toda la aplicación, lo que permite una sola llamada. Durante el 95% del tiempo, todo estuvo bien incluso a través de la regresión de control de calidad, pero los clientes informaban un problema de vez en cuando. La solución fue incluir la llamada a continuación, no usar una llamada estática en las páginas reales.
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
Este no es el caso cuando necesito asegurarme de que se llamó al subproceso de la interfaz de usuario desde App.xaml.cs o mi Singleton NavigationService que manejó empujar / hacer estallar en la pila. El despachador aparentemente estaba perdiendo la pista de qué subproceso de la interfaz de usuario se llamó, ya que cada página tiene su propio subproceso de la interfaz de usuario, cuando la pila tenía una variedad de mensajes que se activaban desde MessageBus.
Espero que esto ayude a otros que puedan verse afectados y también es donde creo que cada plataforma haría un servicio a sus desarrolladores al publicar un proyecto completo que cubra las mejores prácticas.