并行执行一组任务但具有组超时

时间:2016-02-05 12:10:26

标签: c# task-parallel-library

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

我在这里缺少什么?

1 个答案:

答案 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);