我对异步作业的执行顺序有疑问。
我将用示例来问我的问题,因为它更容易理解。
这是https://msdn.microsoft.com/en-us/library/mt674882.aspx中的一个官方示例,有些曲解。
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
//async operation:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoWork1();
// The await operator suspends AccessTheWebAsync.
string urlContents = await getStringTask;
DoWork2();
return urlContents.Length;
}
我可以说
DoWork2
是client.GetStringAsync
的回调吗?如果是这样,如果
DoWork2
运行的时间比client.GetStringAsync
长,则DoWork1
不会在client.GetStringAsync
完成后立即执行。我在这里吗?
最佳答案
DoWork2
在完成后不会立即执行
client.GetStringAsync
如果DoWork1
运行时间比
client.GetStringAsync
一旦您到达await client.GetStrinkAsync
点,DoWork1()
就已经完成,从您的示例中可以看出,它的执行是同步的。 client.GetStringAsync
完成后,将DoWork2
设置为执行。
执行流程将是:GetStringAsync
异步启动。它一直执行到它到达第一个内部await
为止,然后将控制权交还给AccessTheWebAsync
。DoWork1()
开始。由于它是同步的,每个人都在等待它的完成client.GetStringAsync
异步等待完成。 await
自然会对其调用者产生执行控制权。
一旦client.GetStringAsync
完成,执行将返回到AccessTheWebAsync
,并且DoWork2()
将同步执行。urlContents.length
将被返回。
通常,将第一个await
关键字之后的所有内容设置为该方法其余部分的延续。