使用.NET 4.5 async\await框架后,我有一个问题。

让我们看一下这个程序(the msdn example):

    async Task<int> AccessTheWebAsync()
    {
        HttpClient client = new HttpClient();

        Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");

        DoIndependentWork();

        string urlContents = await getStringTask;

        return urlContents.Length;
    }


    void DoIndependentWork()
    {
        resultsTextBox.Text += "Working . . . . . . .\r\n";
    }

该程序将按以下顺序运行:
  • 新的HttpClient。
  • GetStringAsync同步调用。
  • 在某些情况下,GetStringAsync调用将等待,然后控件返回到AccessTheWebAsync。
  • DoIndependentWork被调用。
  • 程序等待字符串返回(如果操作未完成,则阻塞)。
  • 返回urlContent的长度。

  • 让我花了一段时间了解的一件事是,尽管方法GetStringAsync具有名称,但它还是同步运行的(名称约定确实令人误解)。

    在oreder中以异步方式运行该方法,我们需要显式使用Task.RunTask.Factory.StartNew

    但是真正的问题是,如果我们有独立的工作,为什么不立即做它,而是等待从GetStringAsync中调用await? (换句话说,为什么异步方法不能按照定义异步运行?)

    编辑:
    我将重新编写第二和第三个操作:

    (2)GetStringAsync同步启动。

    (3)在某些时候,GetStringAsync调用正在等待并且线程进行了 fork ,该控件返回到AccessTheWebAsync。

    最佳答案



    那是不对的。 GetStringAsync返回一个Task<string>。它将立即返回,这意味着DoIndependentWork(可能)在下载完成之前运行。 await运算符将异步等待,直到Task<T>返回的GetStringAsync完成为止。



    返回方法后,异步方法的实际“工作”就会运行。返回的Task(通常)将处于未完成的状态,这意味着该方法仍在异步运行。您可以检查 Task.IsCompleted 进行验证。

    试试这个:

    Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
    Debug.WriteLine("Completed? {0}", getStringTask.IsCompleted); // Will likely print false
    DoIndependentWork();
    string urlContents = await getStringTask;
    Debug.WriteLine("Completed now? {0}", getStringTask.IsCompleted); // Will always print true
    

    关于c# - .NET异步\等待基础知识,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19460854/

    10-10 13:52