【发布时间】:2015-08-08 05:46:12
【问题描述】:
我创建了下面的函数,当取消或超时发生时,它将等待所有任务完成或引发异常。
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();
}
}
如果所有tasks 在长时间超时之前完成(即millisecondsTimeOut = 60,000),即使在函数返回后,timeoutTask 是否会一直停留到 60 秒?如果是,解决失控问题的最佳方法是什么?
【问题讨论】:
-
它会闲逛,但真的很轻。只要你没有数百个这样的东西,如果你让它运行到完成,你可能不会看到任何区别。但是,您可以在您的方法中创建一个
CancellationTokenSource,将其传递给CancellationToken到Task.Delay。在您的方法结束时,只需取消将终止延迟的令牌。 -
好吧,如果它每秒被调用 100 次,那么这可能是非常重要的开销。您冒着内存使用量爆炸式增长的风险。这是定时内存泄漏。测试时不会被发现。它使应用程序不可靠。
-
这个函数的目的是什么?作为一种信号机制,还是在工作线程执行时暂停主(或监控)线程?如果你只是想杀死所有的工作线程,那么你有
CancellationTokenSource,所以只需使用它......
标签: c# .net async-await task-parallel-library task