Хотя это старый поток, я хотел привлечь внимание к возможной проблеме, с которой могут столкнуться разработчики, которая повлияла на меня и чрезвычайно затруднила отладку в больших приложениях 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% случаев все было хорошо даже при регрессии контроля качества, но клиенты время от времени сообщали о проблеме. Решение заключалось в том, чтобы включить вызов ниже, не используя статический вызов на реальных страницах.
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
Это не тот случай, когда мне нужно убедиться, что поток пользовательского интерфейса был вызван из App.xaml.cs или моего Singleton NavigationService, который обрабатывал нажатие / всплытие в стек. Диспетчер явно не отслеживал, какой поток пользовательского интерфейса был вызван, поскольку каждая страница имеет свой собственный поток пользовательского интерфейса, когда в стеке было множество сообщений, запускаемых из MessageBus.
Надеюсь, это поможет другим, которые могут быть затронуты, и я думаю, что именно здесь каждая платформа окажет услугу своим разработчикам, опубликовав полный проект, охватывающий лучшие практики.