C# 异步/等待未观察到的异常

2023-12-03

我试图理解为什么下面的代码:

async void Handle_Clicked(object sender, System.EventArgs e)
{
    try
    {
        await CrashAsync("aaa");
    }
    catch (Exception exception)
    {
        Log($"observed exception");

        Log($"Exception: {exception.Message}");
    }
}

private async Task CrashAsync(string title)
{
    Log($"CrashAsync ({title}) - before");

    await Task.Delay(1000);

    throw new Exception($"CrashAsync ({title})");

    Log($"CrashAsync ({title}) - after");
}

产生预期结果:

线程 #1:CrashAsync (aaa) - 之前

线程#1:观察到的异常

线程 #1:异常:CrashAsync (aaa)

但如果我把它改成这个:

async void Handle_Clicked(object sender, System.EventArgs e)
{
    try
    {
        await CrashAsync("aaa").ContinueWith(async (t) =>
        {                   
            await CrashAsync("bbb");
        },TaskContinuationOptions.OnlyOnRanToCompletion);
    }
    catch (Exception exception)
    {
        Log($"observed exception");

        Log($"Exception: {exception.Message}");
    }
}

我得到以下输出:

线程 #1:CrashAsync (aaa) - 之前

线程#1:观察到的异常

线程#1:异常:任务被取消。

线程#2:未观察到的异常

线程#2:System.Exception:CrashAsync(aaa) 在 /Users/johndoe/Development/Xamarin/AsyncTest/AsyncTest/AsyncTestPage.xaml.cs:82 中的 AsyncTest.AsyncTestPage+c__async3.MoveNext () [0x000ad]

where:

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    Debug.WriteLine($"thread #{Environment.CurrentManagedThreadId}: unobserved exception");

    foreach (var exception in e.Exception.Flatten().InnerExceptions)
    {
        Debug.WriteLine($"thread #{Environment.CurrentManagedThreadId}: {exception}");
    }
};

不满足继续条件,因此ContinueWith任务被取消,但为什么会出现未观察到的异常?


你等待着Task由返回ContinueWith,所以你观察到与此相关的异常Task- 它被取消了(TaskCanceledException)。但是您没有观察到 CrashAsync 抛出的原始异常(因此“CrashAsync aaa”)异常,因此您观察到的行为。

以下是示例代码,可以帮助您更好地理解:

static async void Test() {
    var originalTask = CrashAsync("aaa");
    var onSuccess = originalTask.ContinueWith(async (t) =>
    {
        await CrashAsync("bbb");
    }, TaskContinuationOptions.OnlyOnRanToCompletion);
    var onFault = originalTask.ContinueWith(t => {                    
        Log("Observed original exception: " + t.Exception.InnerExceptions[0].Message);
    }, TaskContinuationOptions.OnlyOnFaulted);
}

简而言之 - 只需等待您的任务并捕获异常(如果有)。你不需要使用ContinueWith根本没有,因为如果你使用await - 该方法的其余部分是already一个延续。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 异步/等待未观察到的异常 的相关文章

随机推荐

  • 函数修改列表

    def make Ab A b n len A Ab list A for index in range 0 n Ab index append b index 0 print A return Ab copy A 0 0 1 0 1 0
  • VSCode 片段触发器之前有文本吗?

    我想在 VSCode 中创建一个显示 PHP 箭头的代码片段 当我按 键然后按 TAB 键时 我想要 PHP 箭头 gt 这是我的代码片段 PHP arrow prefix body gt 0 description PHP Arrow g
  • R - 将数据帧转换为格式为 featureName:featureValue [重复] 的数据集

    这个问题在这里已经有答案了 原来我想要的格式叫 SVM 轻 并在这里描述http svmlight joachims org 我有一个数据框 我想将其转换为格式如下的文本文件 output featureIndex featureValue
  • 无法在子进程命令中使用 grep

    我的子进程命令有问题 我喜欢 grep 出与 Online 行匹配的行 def run command command p subprocess Popen command shell False stdout subprocess PIP
  • 如何处理 tokio::spawn 闭包需要“static”和“&self”?

    我无法理解如何编写封装在一个结构中的并发异步代码 我不确定如何准确解释这个问题 所以我会尝试用一个例子来解释 假设我有一个UdpServer结构 该结构有多个与其行为相关的方法 例如 handle datagram deserialize
  • 我们是否忽略补码的溢出

    我试图解决二进制补码内的溢出问题 例如说我试图去掉这两个二进制数 1111 1000 0100 010 111 001 000 我将第二个二进制数转换为两个补码等值 然后简单地将其相加 但我注意到它导致了 1 的溢出 我是否只是忽略溢出 或
  • 未找到 Python 模块,但该模块存在于文件夹中

    我正在尝试执行一个简单的 PY 文件 但收到以下错误 Traceback most recent call last File docker pull py line 8 in
  • Python 中可能存在混合缩进吗?

    看着this问题 我在我的机器上尝试了OP的代码 这里有一个文字版和截图 刚刚发生了什么 这应该是一个square功能 并且已正确实现 可以肯定的是 我复制粘贴了代码 然后再次尝试 好吧 我看不出这些版本之间有什么区别square 但只有后
  • 使用 clusplot 绘制以 0 为中心坐标的聚类

    我正在尝试绘制 GIS 坐标 特别是东向和北向相似的英国国家网格坐标 194630000 562220000 我可以使用 Cluster 库中的 clusplot 绘制这些图 clusplot df2 k means fit cluster
  • Javascript 函数生成具有非均匀概率的随机整数

    在javascript 或jquery 中 有一个简单的函数可以计算四个整数及其概率值 1 0 41 2 0 29 3 0 25 4 0 05 我怎样才能生成这四个数字并考虑到它们的概率 这个问题与这里发布的问题非常相似 生成具有概率的随机
  • php 5.3.1 的 phpinfo() 中未启用 mysql

    我在 Vista 上安装了 apache 2 2 14 php 5 3 1 和 mysql 5 1 43 两天以来我一直在尝试配置 php 以在 phpinfo 上启用 mysql 我修改了 php ini 使其具有 extension d
  • 惰性类属性装饰器

    我有一个 Django 模型 需要对自定义用户模型进行一些处理 我无法在类加载时使用该模型的类 因为类的加载顺序未知 所以我需要在运行时添加一些类属性 目前我将它们添加到 init or new like def new cls args
  • SQL Server 对浮点字段“like”会产生不一致的结果

    我在用LIKE返回针对浮点字段的匹配数字结果 似乎一旦小数点左侧超过 4 位 则不会返回与我的小数点右侧搜索项匹配的值 下面是一个说明这种情况的示例 CREATE TABLE number like test num FLOAT NULL
  • 使用 ord 和 chr 移动字母

    我正在尝试执行一个函数 将每个单词中的每个字母按值向右移动 这些单词将来自一个列表 我将使用 打开 功能打开它 我写了代码 我在这里面临一些困难 这是我的代码 def test value eval input Value here wit
  • 模板化友元函数查找

    下面的简单代码可以很好地编译 class A int x 3 public A x 0 1 x 1 2 x 2 3 friend int const at A const a unsigned i noexcept return a x i
  • 为什么下面的函数被调用三次

    我曾尝试调试 但没有运气 我无法理解为什么第二个 printf 调用increment 三次 但第一个按预期调用两次 include
  • 使用正则表达式和转义双引号将变量通过管道传输到 FINDSTR

    我试图理解发送给我的批处理文件 以便在第三方程序解决问题时解决该错误 基本上 他们正在运行 findstr 正则表达式命令来确定字符串是否匹配 如果是这样 则不应删除的特殊字符将在传递到原始命令行程序之前手动添加回来 据我所知 所提供的内容
  • gitcherrypick 不工作

    我正在尝试从 master 中挑选一个提交并将其放入当前的生产分支中 但是 当我执行git cherry pick
  • 在.net core中编写Windows服务

    我的问题是如何在 net core 中编写我们在以前的 net 版本中编写的 Windows 服务 许多链接 文章解释了如何将 net core 应用程序托管为 Windows 服务 那么这是我创建 Windows 服务的唯一方法吗 如果是
  • C# 异步/等待未观察到的异常

    我试图理解为什么下面的代码 async void Handle Clicked object sender System EventArgs e try await CrashAsync aaa catch Exception except