c# - 在 UWP 应用程序中处理 Dispatcher 异常

标签 c# exception uwp

在我的 UWP 应用程序中,我需要从另一个线程更新 UI,我正在使用 CoreDispatcher 来执行此操作。我希望任何未处理的异常都会终止应用程序,就像 UI 线程中的异常一样,但情况似乎并非如此。下面的 RunAsync lambda 中抛出的异常被 UWP 静默忽略。此外,这些异常永远不会发送到任何应用程序 UnhandledException 处理程序(下面示例中的第二个异常是)。

这是怎么回事? Dispatcher 是否只是捕获所有异常并默默地忽略它们?

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        var dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;

        Task.Run( async () =>
        {
            await Task.Delay(2000);

            await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                throw new Exception("This exception will not terminate the app.");
            });
        });
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        throw new NotImplementedException("This will terminate the app");
    }
}

最佳答案

它们在技术上并不是无人处理的,因为任务中的异常被“捕获”并包装在 Task 对象中。如果该异常未以某种方式从任务中消耗(通过等待任务或使用 .ContinueWith),当任务被垃圾收集时,您可以收听 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; 以获取该异常 - 如果您愿意或重新抛出,您可以从那里手动终止应用程序。

当然要记住,根据您编写代码的方式,不能保证 Task 会很快被垃圾收集,或者根本不会被垃圾收集 - 所以如果您在任何地方存储对 Tasks 的引用,这是很有可能的如果您不小心,请默默地吞下此类异常。

关于c# - 在 UWP 应用程序中处理 Dispatcher 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48948806/

相关文章:

c# - ListView 拖放时未更新

c# - 如何在 xaml 中填充宽度的窗口中绘制一条线

c# - 如何在旧版本的 Windows 10 上测试应用程序?

c# - C# 子类中的 protected 属性是否应该隐藏对父类公共(public)属性的访问?

c# - 无法捕获 MS Chart 控件异常

c# - 无法在 C# 中捕获 0xC0000005 异常

c++ - 抛出 C++0x 异常的代价

c++ - 从非托管 DLL 调用 UWP api

c# - 使用 Entity Framework Core 2 Code First 创建 varchar

c# - 如何删除.net core 2.0中的x-powered-by header