只是想确保我正确地得到这个,因为我根据我的结果看到一些奇怪的行为。
我已经定义了一个异步方法如下:
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
才会执行?或者并行?
答案 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方法的详细信息。