异步组合行为

时间:2017-05-21 19:41:26

标签: c#

想了解async / await等待多个任务的想法。下面是@Stephen Clary的网页上的代码。我刚刚添加了方法DoIndependentJob1()和DoIndependentJob2()用于测试目的。

第一种方法(DoOperationsConcurrentlyAsync) 似乎对我很清楚(请确认我理解正确:

  • 我们执行3项任务并开始执行工作
  • 同时DoIndependentJob也可以运行。
  • 然后在运行DoIndependentJob2之前,必须完成所有三个任务

第二种方法(GetFirstToRespondAsync):   - 我们运行2个任务,他们开始做这些工作   - 同时DoIndependentJob也运行。   - 现在我们等待2个任务中的任务(其中一个将是第1个)   - 让我们说WebService1Async就是那个

然后呢? DoIndependentJob2()是否会被触发,即使WebService2Async仍在运行,并且意味着WebService2Async将被解雇并忘记在这种情况下因为我们不等待它?请不要澄清这一点......

public async Task DoOperationsConcurrentlyAsync()
{
  Task[] tasks = new Task[3];
  tasks[0] = DoOperation0Async();
  tasks[1] = DoOperation1Async();
  tasks[2] = DoOperation2Async();
  // At this point, all three tasks are running at the same time.

  //Doing some independent jobs
  DoIndependentJob()

  // Now, we await them all.
  await Task.WhenAll(tasks);

//Doing some independent jobs
  DoIndependentJob2()
}

public async Task<int> GetFirstToRespondAsync()
{
  // Call two web services; take the first response.
  Task<int>[] tasks = new[] { WebService1Async(), WebService2Async() };

 //Doing some independent jobs
  DoIndependentJob()

  // Await for the first one to respond.
  Task<int> firstTask = await Task.WhenAny(tasks);

//Doing some independent jobs
  DoIndependentJob2()

  // Return the result.
  return await firstTask;
}

1 个答案:

答案 0 :(得分:1)

是的,这是正确的。

您的GetFirstToRespondAsync方法将等待任务完成,此时它将继续,firstTask引用该任务。

当其他任务完成时并不重要。正如你所说,&#34;火,忘了&#34;,好吧,而不是&#34;火,然后可选择忘记&#34;。

所以当你从方法返回时,其他任务可能仍在运行,或者它可能已经完成,也许它甚至在第一个任务完成之后但在调用DoIndependentJob2之前完成,谁知道。