捕获循环中的异步错误

时间:2015-03-27 01:32:48

标签: c# .net loops error-handling async-await

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之后停止?

1 个答案:

答案 0 :(得分:2)

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

您不应该在事件处理程序之外使用async voidasync void没有返回等待,因此调用方法只是继续(并退出应用程序)。您应该返回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