await運算子只能用於非同步方法中,為什麼?

2021-10-19 08:58:33 字數 992 閱讀 2389

在我們日常用async/await程式設計的時候,會遇到這個錯誤,「await運算子只能用於非同步方法中」,就不明白原因,既然我已經使用await,已經等待任務完成,已經是同步了,為什麼await還只能用在非同步方法中。

最近正好看到一篇文章談到async/await用法,就想到了這個問題,搜沒有搜到。重新看了一遍微軟官方說明,找到了答案。原來以前自己的理解是錯誤的。

await 運算子(c# 參考)中提到「await 運算子暫停對其所屬的 async 方法的求值,直到其運算元表示的非同步操作完成」,「當 await 運算子暫停其所屬的非同步方法時,控制項將返回到方法的呼叫方」。應該是機器翻譯的,不太好理解。參照他給出的例子,意思就是downloaddocsmainpageasync方法中遇到await,就暫停執行downloaddocsmainpageasync方法了,將繼續執行downloaddocsmainpageasync方法的呼叫方main方法,直至main方法需要downloaddocsmainpageasync的結果。

使用 async 和 await 的非同步程式設計中提到「不要阻塞,而要 await」,自己通過實驗證實,使用了await關鍵字,並不會阻塞主線程gui響應。也就是這一段描述的意思「在煎雞蛋或培根時,此**不會阻塞。 不過,此**也不會啟動任何其他任務。 你還是會將麵包放進烤麵包機裡,然後盯著烤麵包機直到麵包彈出。 但至少,你會回應任何想引起你注意的人。 在接受了多份訂單的一家餐館裡,廚師可能會在做第乙份早餐的同時開始製作另乙份早餐。」使用了await,暫停當前函式的執行,但是呼叫方會繼續執行,開始做另乙份早餐。

另外乙個問題。

用async來修飾乙個方法,方法內部必須含有await修飾的方法,如果方法內部沒有await關鍵字修飾的表示式,哪怕函式被async修飾也只能算作同步方法,執行的時候也是同步執行的。

自己測試了一下只將方法定義為async的,內部不使用await,會阻塞。這個也不難理解,async修飾的函式不會自動建立新的執行緒去執行自己的**,否則也就不需要await了,整個都是非同步的了。

不知道有沒有紕漏呢,歡迎拍磚。

關於有些運算子只能用成員函式過載

1.只能通過成員函式來過載 c 規定賦值運算子 只能過載為類的非靜態成員函式,而不可以過載為類的友元函式。不能過載為類的靜態成員應該比較容易理解,因為靜態成員函式是屬於整個類的,不是屬於某個物件的,它只能去操作類靜態資料成員。而賦值運算子 是基於物件操作的。那麼為什麼賦值運算子不可以過載為類的友元函...

結構體用於map,set時要過載運算子

c sharp view plain copy include include using namespace std struct p intmain set iterator itr for itr s.begin itr s.end cin.eof itr if itr time 2 cout...

python中字串支援的運算子及使用方法

在python中,字串可以使用以下運算子 innot in isis not 使用方法舉例 運算子,拼接字串的作用 s1 hello s2 world print s1 s2 執行結果 運算子,字串的倍數 s1 a 5print s1 執行結果 in 運算子,判斷是否在字串中,返回布林型別 true...