2016-02-05 66 views
0

我目前正在尝试写一个可靠的超时值的状态检查工具。我看到如何做到这一点的方法之一是使用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

它会产生什么结果? “不起作用”是一个非常普遍的术语,很难让我们知道什么是错的。例外?编译错误?从来没有从第二次WhenAll返回? –

回答

0

我认为你很难将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

相关问题