0

我正在研究Exam Ref 70-483: Programming in C# book 中的示例,并且遇到了清单 1-44 中的以下代码的问题。在这个例子中,作者试图证明一个延续任务可以访问在前面的任务中抛出的未处理的异常,并且可以在适当的时候处理它们。

static void Main(string[] args)
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    CancellationToken token = cancellationTokenSource.Token;

    Task task = Task.Run(() =>
    {
        while (!token.IsCancellationRequested)
        {
            Console.Write("*");
            Thread.Sleep(1000);
        }
        throw new OperationCanceledException();
    }, token).ContinueWith((t) =>
    {
        t.Exception.Handle((e) => true);
        Console.WriteLine("You have canceled the task.");
    }, TaskContinuationOptions.OnlyOnCanceled);

    Console.WriteLine("Press enter to stop the task.");
    Console.ReadLine();

    cancellationTokenSource.Cancel();
    task.Wait();

    Console.WriteLine("Press enter to end the application.");
    Console.ReadLine();
}

不幸的是,这行代码在继续

t.Exception.Handle((e) => true);

抛出异常,因为t.Exceptionis null

在该行设置断点,我可以看到t.StatusCanceled,不是Faulted。这就是为什么异常不可用的原因吗?处理前面任务中抛出的异常的正确方法是什么?

4

2 回答 2

1

利用

task.ContinueWith(HandleError, TaskContinuationOptions.OnlyOnFaulted);

取消的任务并不例外......因此不会包括例外。有缺陷的会。

于 2013-10-24T02:52:28.397 回答
0

将示例 1-44 的代码更改为:

Task task = Task.Run(() => { 
    while (true) 
    {
     token.ThrowIfCancellationRequested();
     Console.Write("*");
     Thread.Sleep(1000); }
    }, token).ContinueWith(t =>
 { Console.WriteLine("You have canceled the task"); }, TaskContinuationOptions.OnlyOnCanceled);
于 2015-06-27T10:42:08.983 回答