在循环中捕获异步错误

Catching async errors in a loop

using System;
using System.Threading.Tasks;

public class Program
{
    public static void Main()
    {
        var p = new Program();
        p.Loop();
    }

    public async void Loop()
    {
        for (int i = 0; i < 5; ++i)
        {
            try
            {
                Console.WriteLine(i);
                var result = await SomeTask();
                Console.WriteLine(result);
            }
            catch (Exception)
            {
                Console.WriteLine("Error" + i);
            }
        }
    }

    public async Task<string> SomeTask()
    {
        await Task.Delay(1);
        throw new Exception();
        return "Result";
    }
}

输出

0
Error0
1

我希望输出更像这样:

0
Error0
1
Error2
2
Error2
3
Error4
4

为什么在0之后就停止了?

您没有等待 async 操作完成,因此应用程序在操作有机会完成之前结束。

您不应该在事件处理程序之外使用 async voidasync void 不是 return 可等待的,因此调用方法只是继续(并退出应用程序)。你应该 return 一个 Taskawait 它(或者在 Main 的情况下使用 Task.Wait):

public static void Main()
{
    var p = new Program();
    p.LoopAsync().Wait();
}

public async Task LoopAsync()
{
    for (int i = 0; i < 5; ++i)
    {
        try
        {
            Console.WriteLine(i);
            var result = await SomeTask();
            Console.WriteLine(result);
        }
        catch (Exception)
        {
            Console.WriteLine("Error" + i);
        }
    }
}

输出:

0
Error0
1
Error1
2
Error2
3
Error3
4
Error4