我对异步作业的执行顺序有疑问。

我将用示例来问我的问题,因为它更容易理解。

这是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;
}


我可以说DoWork2client.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关键字之后的所有内容设置为该方法其余部分的延续。

09-04 17:43