我创建了下面的函数,它将等待所有任务完成或在取消或超时时引发异常。
如果所有的任务在长时间超时(即
public static async Task WhenAll(
IEnumerable<Task> tasks,
CancellationToken cancellationToken,
int millisecondsTimeOut)
{
Task timeoutTask = Task.Delay(millisecondsTimeOut, cancellationToken);
Task completedTask = await Task.WhenAny(
Task.WhenAll(tasks),
timeoutTask
);
if (completedTask == timeoutTask)
{
throw new TimeoutException();
}
}
如果所有的任务在长时间超时(即
millisecondsTimeOut
= 60,000)之前都已经完成,那么timeoutTask
会一直保持在原地直到60秒过去,甚至在函数返回后也是如此吗?如果是,最好的方法是什么来解决这个问题?
CancellationTokenSource
,将该CancellationToken
传递给Task.Delay
。在你的方法结束时,只需取消该令牌,就可以终止延迟。 - Jacob RobertsCancellationTokenSource
,所以只需使用它即可... - code4life