2

今天碰到这个。谁能解释为什么这会引发 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 - 它可以工作。

4

1 回答 1

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

你是这个意思吗?

于 2013-09-14T06:37:38.900 回答