我目前正在尝试编写一个具有可靠超时值的状态检查工具。我看到如何做到这一点的一种方法是使用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);
}
我在这里缺少什么?
答案 0 :(得分:0)
我认为您将When...
来电的工作与Wait...
混为一谈。
Task.WhenAny
并未在您传递给它的人中返回完成的第一项任务。相反,它会返回 new 任务,该任务将在任何内部任务完成时完成。这意味着您的等式检查将始终返回false - 新任务将永远不会等于前一个任务。
您期望的行为与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);