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 上找到。
只是想确保我正确地理解了这一点,因为我看到了一些基于我的结果的奇怪行为。
我定义了一个异步方法如下:
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 上找到。