c# - 返回任务的结果 - 包括异常?

标签 c# asynchronous

以下代码并行运行M1M2M3M4。每个方法都可能引发异常。该方法应返回四种异步方法的结果——方法返回的 int 或异常。

async Task<string> RunAll()
{
    int m1result, m2result, m3result, m4result;
    try
    {
        var m1task = M1();
        var m2task = M2();
        var m3task = M3();
        var m4task = M4();
        // await Task.WhenAll(new Task<int>[] { m1task, m2task, m3task, m4task });
        m1result = await m1task;
        m2result = await m2task;
        m3result = await m3task;
        m4result = await m4task;
    }
    catch (Exception ex)
    {
        // need to return the ex of the failed task. How?
    }
    // How to implement M1HasException, M2HasException, ... in the following lines?
    var m1msg = M1HasException ? M1ExceptionMessage : m1result.ToString();
    var m2msg = M2HasException ? M2ExceptionMessage : m2result.ToString();
    var m3msg = M3HasException ? M3ExceptionMessage : m3result.ToString();
    var m4msg = M4HasException ? M4ExceptionMessage : m4result.ToString();
    return $"M1: {m1msg}, M2: {m2msg}, M3: {m3msg}, M4: {m4msg}";
}

如何捕获失败任务的个别异常?

例如,如果只有M2抛出异常,

"M1: 1, M2: Excpetion...., M3: 3, M4: 4"

最佳答案

每个任务都有一个 Status 和 Exception 属性。

您可能想看看它是否有故障:

myTask.Status == TaskStatus.Faulted

或者如果它已经排除:

if (myTask.Exception != null) 

您可以使用ContinueWhenAll 运行所有任务,然后检查状态。

See the docs here .

关于c# - 返回任务的结果 - 包括异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639460/

相关文章:

javascript - 如何从异步调用返回响应?

c# - 如何在使用多线程时添加到列表?

c# - 在 C# 中创建保留文件夹结构的 zip 存档

c# - 如何在变量声明 (CS0270) 中强制执行数组的长度?

c++ - I/O 完成端口的异步操作返回 0 字节传输

ios - 从 objective-c 中的两个不同进程写入资源的最佳实践

javascript - 如何在 Node 的嵌套函数中使用回调?

python在线程中的exec脚本中中断无限循环

c# - 使用 asp.net mvc 3 将文件上传到文件夹时访问被拒绝?

c# - 表单应用程序未接收鼠标或键盘事件