具有OnFaulted延续的任务会在WaitAll上抛出TaskCancelledException

时间:2013-09-14 02:05:38

标签: c# task-parallel-library

今天进入这个。 谁能解释为什么会抛出TaskCancelledException?

Task[] tasks = new Task[4];
for (int i = 0; i < 4; i++)
{
    Task t = Task.Run(() => { }).ContinueWith((task) => { }, TaskContinuationOptions.OnlyOnFaulted);
    tasks[i] = t;
}
Task.WaitAll(tasks);

如果我指定NotOnFaulted - 它可以工作。

1 个答案:

答案 0 :(得分:2)

您的Task t变量是ContinueWith的返回值,只有在抛出Exception (OnlyOnFaulted)时才会执行。否则,将取消继续。

所以在这种情况下它会被取消;没有执行。因此等待它会引发TaskCancelledException

Task[] tasks = new Task[4];
for (int i = 0; i < 4; i++)
{
    Task t = Task.Run(() =>
    {

    });
    t.ContinueWith((task) => 
    { 

    }, TaskContinuationOptions.OnlyOnFaulted);
    tasks[i] = t;//t is from Task.Run not ContinueWith
}
Task.WaitAll(tasks);

你的意思是?