Chociaż jest to stary wątek, chciałem zwrócić uwagę na możliwy problem, z którym mogą się spotkać programiści, który wpłynął na mnie i bardzo utrudnił debugowanie w dużych aplikacjach UWP. W moim przypadku w 2014 roku przerobiłem poniższy kod z powyższych sugestii, ale od czasu do czasu nękany był przez sporadyczne zawieszanie się aplikacji, które miało charakter losowy.
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;
}
}
Z powyższego korzystałem z klasy statycznej, aby umożliwić wywołanie Dispatchera w całej aplikacji - pozwalając na pojedyncze wywołanie. W 95% przypadków wszystko było w porządku, nawet przy regresji kontroli jakości, ale klienci od czasu do czasu zgłaszali problem. Rozwiązaniem było dołączenie wywołania poniżej, bez używania wywołania statycznego na rzeczywistych stronach.
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
Nie dzieje się tak, gdy muszę upewnić się, że wątek interfejsu użytkownika został wywołany z App.xaml.cs lub mojej usługi Singleton NavigationService, która obsługiwała wypychanie / wyskakiwanie na stos. Dyspozytor najwyraźniej tracił informacje o tym, który wątek interfejsu użytkownika został wywołany, ponieważ każda strona ma swój własny wątek interfejsu użytkownika, gdy stos miał różne komunikaty wyzwalane z MessageBus.
Mam nadzieję, że pomoże to innym, na których może to mieć wpływ, i myślę, że jest to również miejsce, w którym każda platforma świadczyłaby usługę swoim programistom, publikując kompletny projekt obejmujący najlepsze praktyki.