C# - 等待和异步

C# - Await and async

只是想确保我正确地理解了这一点,因为我看到了一些基于我的结果的奇怪行为。

我定义了一个异步方法如下:

public async Task<System.Net.HttpStatusCode> GetJson(Stream inputJson)
{
  ......
  .....
  ...
  var query1 = from xxx in new xxx()
               where xxx.id == myID
               select xxx;
  var results1 = await query1.FindAsync();

  var query2 = from yyy in new yyy()
               where yyy.id == myID
               select yyy;
  var results2 = await query2.FindAsync();
  ...
  ....
  .....
  return System.Net.HttpStatusCode.OK;
}

query2会不会在query1执行完后才执行?还是并行?

await 之后的代码被构造为所谓的continuation。关键部分是这一行:

var results1 = await query1.FindAsync();

FindAsync构造一个Task然后await表示剩下的应该是那个任务的延续

这意味着该方法的其余部分将是另一个 Task,并且该任务只会在第一个完成后执行。更有什者,如果第一个任务抛出异常,第二个任务甚至都不会启动。

因此,您问题的答案是:是的,query2 将始终在 query1 完成后执行。

在您的情况下,query1 将开始并且该方法将暂停执行,直到 query1 完成。只有这样 query2 才会开始。如果您想并行执行它们,请查看 Task.WhenAll(...) MSDN

query2 将在 await query1.FindAsync() 之后执行 return 结果。但要注意它将在哪个线程上继续。这取决于。

如果你想同时做你可以使用Task.WhenAll方法。 示例:

var firstTask = FirstMethodAsync();
var secondTask = SecondMethodAsync();
await Task.WhenAll(firstTask, secondTask); 
// Here you can pull out Results from firstTask and secondTask.
var firstResult = firstTask.Result;
var secondResult = secondTask.Result;

有关 WhenAll 方法的更多信息,您可以在 here MSDN 上找到。