0

嗨,我有以下代码:

    try
    {
        var t1 = Task.Factory.StartNew(() =>
        {
            Count(5, 10);
        });
        //t1.Wait(); //This line if uncommented causes the exception to be handled below....
        Console.WriteLine("done");
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(ex);
    }

    private void Count(int start, int end)
    {
        for (var i = start; i <= end; i++)
        {
            Console.WriteLine(i);
            if (i == 7) throw new InvalidOperationException("Something bad happened");
            Thread.Sleep(1000);
        }
    }

如果我不想等待我的任务,但仍想处理异常,我该如何实现?

4

2 回答 2

6

创建一个在任务失败时处理错误的延续:

var t1 = Task.Factory.StartNew(() =>
    {
        Count(5, 10);
    });
t1.ContinueWith(
    (task) =>
    {
        var error = task.Exception;
        // handle error
    }, TaskContinuationOptions.OnlyOnFaulted);

OnlyOnFaulted指定如果任务失败,延续将在线程池线程上运行。如果任务成功完成,则不会执行。

于 2012-08-10T14:57:00.947 回答
0

创建和启动任务的堆栈可能不再存在......如何处理异常?

你可以:

  1. 将异常处理放在每个任务堆栈的顶部。
  2. 创建一个任务来创建/启动/等待/处理子任务的异常
  3. 创建一个继续任务来处理异常(如 Sean U 的回答)。
于 2012-08-10T15:00:38.103 回答