簡體   English   中英

異步方法await關鍵字不會暫停到調用方法

[英]Async method await keyword doesn't suspend to calling method

我有以下代碼行,以了解async-await和暫停直到等待完成的任務。

public async Task<string> WaitAsynchronouslyAsync()
    {
        var results = await WaitAsync();
        Console.WriteLine($@"I am not waiting");
        return results;
    }

    public async Task<string> WaitAsync()
    {
        await Task.Delay(10000).ConfigureAwait(false);
        return "Async programming suspension point demo.";
    }

await操作符將暫停執行,直到WaitAsync() (延遲10秒)方法的工作完成為止。

在此期間,我期待的是Console.WriteLine($@"I am not waiting"); 應該將文本寫入輸出窗口,直到等待的任務完成為止,因為控制權已返回給WaitAsync()的調用方。 任務完成執行后,await表達式將計算字符串( "Async programming suspension point demo." )。

我在這里將懸浮指針與調試指針混淆了嗎?

等待操作符將暫停執行,直到WaitAsync()方法的工作完成為止。

正確。

我期待的是Console.WriteLine($ @“我不在等待”); 應該將文本寫入輸出窗口,直到等待的任務完成為止,因為控制權已返回給WaitAsync()的調用方。

為什么? 您只是說過await運算符會暫停執行直到工作完成 再過十秒鍾,這項工作將無法完成; 工作是等待十秒鍾 直到執行returnWaitAsync工作 WaitAsync完成,並且在將來。

正確的做法是,讓WaitAsynchronouslyAsync允許調用方在這種情況下運行。

您已經正確說明了await的含義,但是您似乎沒有完全將后果內在化。 await檢查其操作數以查看任務是否完成。 如果是,則獲取任務的結果,該方法繼續。 如果不是,則將該方法的其余部分簽署為該任務的繼續,並產生控制權,以便可以在其他地方完成更多工作。 將來,當任務完成時,將計划執行該方法的其余部分。

await表示“等待,直到異步完成執行”,直到提供的Task完成執行后,您的功能才會繼續。

如果您改為說以下內容,將不會等待:

var results = WaitAsync();
Console.WriteLine($@"I am not waiting");
return await results;

或更簡潔地說,從簽名中刪除async ,然后就可以return results;

操作順序如下:

  1. 您調用WaitAsynchronouslyAsync
  2. WaitAsynchronouslyAsync調用WaitAsync
  3. WaitAsync調用Task.Delay(10000).ConfigureAwait(false) ,從而產生Task
  4. WaitAsync將新的Task返回給其調用方WaitAsynchronouslyAsync ,稍后將完成
  5. WaitAsynchronouslyAsync等待從任務WaitAsync ,然后返回到它的調用者,提供了一個Task代表將於何時完成。
  6. 在調用堆棧中還會發生其他事情。
  7. Task.Delay完成后,將觸發WaitAsync的延續,並從中斷處繼續。
  8. WaitAsync返回字符串,完成Task
  9. 由於從WaitAsync返回的Task已完成,因此WaitAsynchronouslyAsync現在可以繼續。 它將繼續向控制台輸出文本。
  10. WaitAsynchronouslyAsync完成它的任務,讓任何設置了任何東西的人都可以在它完成時運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM