Mặc dù đây là một chủ đề cũ, nhưng tôi muốn thu hút sự chú ý đến một vấn đề có thể mà các nhà phát triển có thể gặp phải, điều này đã ảnh hưởng đến tôi và khiến việc gỡ lỗi trong các ứng dụng UWP lớn trở nên cực kỳ khó khăn. Trong trường hợp của tôi, tôi đã cấu trúc lại mã sau từ các đề xuất ở trên vào năm 2014 nhưng đôi khi sẽ gặp khó khăn với việc ứng dụng không thường xuyên bị đóng băng có tính chất ngẫu nhiên.
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;
}
}
Từ phần trên, tôi đã sử dụng một lớp tĩnh để cho phép gọi Ứng dụng điều phối xuyên suốt - cho phép thực hiện một cuộc gọi duy nhất. Trong 95% thời gian, mọi thứ đều ổn ngay cả khi thông qua hồi quy QA nhưng thỉnh thoảng khách hàng sẽ báo cáo sự cố. Giải pháp là bao gồm lệnh gọi bên dưới, không sử dụng lệnh gọi tĩnh trong các trang thực tế.
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
});
Đây không phải là trường hợp khi tôi cần đảm bảo Chuỗi giao diện người dùng đã được gọi từ App.xaml.cs hoặc Singleton NavigationService của tôi, xử lý việc đẩy / bật vào ngăn xếp. Điều phối viên dường như đã mất theo dõi Chuỗi giao diện người dùng nào được gọi, vì mỗi trang có chuỗi giao diện người dùng riêng của nó, khi ngăn xếp có nhiều Thông báo kích hoạt từ MessageBus.
Hy vọng điều này sẽ giúp những người khác có thể bị ảnh hưởng và đó cũng là nơi tôi nghĩ rằng mỗi nền tảng sẽ thực hiện một dịch vụ cho các nhà phát triển của họ bằng cách xuất bản một dự án hoàn chỉnh bao gồm các phương pháp hay nhất.