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