瀏覽通道9 msdn視頻我發現了以下未答覆的評論,並希望有人可以解釋它?爲什麼存在異步關鍵字
我沒有得到異步關鍵字的觀點。爲什麼在任何時候該方法返回Task都不允許 await關鍵字,就像迭代器 可以返回任何返回IEnumerable的方法一樣。
我確定有一個很好的理由,我只是想明白爲什麼上述建議是不可能的。
瀏覽通道9 msdn視頻我發現了以下未答覆的評論,並希望有人可以解釋它?爲什麼存在異步關鍵字
我沒有得到異步關鍵字的觀點。爲什麼在任何時候該方法返回Task都不允許 await關鍵字,就像迭代器 可以返回任何返回IEnumerable的方法一樣。
我確定有一個很好的理由,我只是想明白爲什麼上述建議是不可能的。
它主要介紹以避免向後兼容的問題。如果方法的性能必須由編譯器推斷(這可能是通過檢測await
關鍵字),那麼現有代碼會突然被區別對待,特別是當您有標識符(變量或函數名稱稱爲await
)。
,完整的解釋是在這裏:http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
我想也許這篇文章涵蓋了一個道理:
http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx
第一款規定:
什麼激發了設計決策許多人問我 要求任何方法其中包含一個「await」表達式,其前綴爲 ,上下文關鍵字爲「async」。
它的結論:
這一大堆的利弊;在對其全部進行了評估之後,還有大量的玩家正在玩這個原型編譯器,以瞭解它的感受,C#設計師決定要求一個包含「await」的方法需要「異步」。我認爲這是一個合理的選擇。
它的缺點是向後兼容。
延伸閱讀:
+1。引用Eric Lippert是* * * Eric Lippert的下一個最好的東西:) – Benjol 2012-02-10 14:04:30
我只想補充一點,我非常希望C#2設計人員決定在每個預期方法的開始處放置「迭代器」或一些類似的關鍵字成爲一個迭代器。在知道它是否爲迭代器塊之前,必須解析*可能是整個方法體*是非常令人頭疼的。 – 2012-02-10 17:08:29
更不用說它會允許匿名方法成爲迭代器了。 – 2012-08-07 12:41:04
對於我來說,最引人注目的原因是return
句話的意思時,功能變得async
變化。如果沒有asnyc
return x
的意思是「價值x
返回任務」,並與異步這意味着「任務的結果集x
。
前一陣子我在我的博客寫了一個summary of async/await keyword questions。
這裏的部分「推斷async
」的結論:
埃裏克利珀有關於這個主題的definitive post。這也在blog comments,Channel9和forums中討論過。
總而言之,一個單詞
await
關鍵字將是一個突破性變化太大。選擇是在等待多字(例如,await for
)或方法(async
)上的關鍵字之間進行,該關鍵字將在該方法內啓用await
關鍵字。明確標記方法async
對於人類和計算機來說都更容易解析,因此他們決定使用async/await
對。
我的spidey-sense在刺痛...... Jon Skeet正在路上!雖然我們都在等待,稍後再閱讀一下:http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence- await.aspx – 2012-02-10 09:49:01
需要在不同位置使用兩個關鍵字來實現一個新功能,這似乎是一個糟糕的設計選擇。事實上,很多人問這個問題意味着(對我)做出錯誤的選擇。通過博客中的所有推理,我可以遵循邏輯,但妥協並不總是最好的計劃。有時候最好打破一些代碼並繼續前進。 – adelphus 2012-02-10 10:34:49
我個人認爲是最安全的選擇。如果破壞代碼和不破壞代碼之間的所有內容都是簡單的關鍵字,那麼這不是一項太繁重的任務。人們可能會對此發表看法,但可以假設他們不會遇到向後兼容性問題。許多同意或不偏不倚的人不會發聲。 – 2012-02-10 11:04:32