并行执行一组任务,但有一个组超时
问题描述:
我目前正在尝试写一个可靠的超时值的状态检查工具。我看到如何做到这一点的方法之一是使用Task.WhenAny()和包括Task.Delay,但它似乎并没有产生我所期望的结果:并行执行一组任务,但有一个组超时
public void DoIUnderstandTasksTest()
{
var checkTasks = new List<Task>();
// Create a list of dummy tasks that should just delay or "wait"
// for some multiple of the timeout
for (int i = 0; i < 10; i++)
{
checkTasks.Add(Task.Delay(_timeoutMilliseconds/2));
}
// Wrap the group of tasks in a task that will wait till they all finish
var allChecks = Task.WhenAll(checkTasks);
// I think WhenAny is supposed to return the first task that completes
bool didntTimeOut = Task.WhenAny(allChecks, Task.Delay(_timeoutMilliseconds)) == allChecks;
Assert.True(didntTimeOut);
}
缺少什么我在这里?
答
我认为你很难将When...
调用的工作与Wait...
混淆。
Task.WhenAny
不会在您传递给它的人中完成第一项任务。相反,它会返回新的任务将在内部任务的任何完成时完成。这意味着您的平等检查将始终返回错误 - 新任务将永远不会与先前的任务相同。
你期望的行为似乎类似于Task.WaitAny
,这将块当前执行,直到所有的完整的内部任务,并返回指数已完成任务的。 使用WaitAny,您的代码将如下所示:
// Wrap the group of tasks in a task that will wait till they all finish
var allChecks = Task.WhenAll(checkTasks);
var taskIndexThatCompleted = Task.WaitAny(allChecks, Task.Delay(_timeoutMilliseconds));
Assert.AreEqual(0, taskIndexThatCompleted);
+0
感谢您的快速准确响应 – Shaun
它会产生什么结果? “不起作用”是一个非常普遍的术语,很难让我们知道什么是错的。例外?编译错误?从来没有从第二次WhenAll返回? –