任务并行库 - 没有处理异常?

时间:2012-08-10 14:48:56

标签: c# task-parallel-library

您好我有以下代码:

    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);
        }
    }

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

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

你可以:

  1. 将异常处理放在每个任务堆栈的顶部。
  2. 创建任务以创建/启动/等待/处理子任务的例外
  3. 创建一个继续任务来处理异常(如Sean U的回答)。