C# - 等待和异步

时间:2016-12-02 11:39:18

标签: c# wcf asynchronous parse-platform

只是想确保我正确地得到这个,因为我根据我的结果看到一些奇怪的行为。

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

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才会执行?或者并行?

3 个答案:

答案 0 :(得分:2)

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

var results1 = await query1.FindAsync();

FindAsync构建一个Task,然后await表示其余的应该是该任务的延续。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

如果您想同时执行此操作,可以使用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;

有关在MSDN上可以找到here的WhenAll方法的详细信息。