2012-02-10 145 views
36

瀏覽通道9 msdn視頻我發現了以下未答覆的評論,並希望有人可以解釋它?爲什麼存在異步關鍵字

我沒有得到異步關鍵字的觀點。爲什麼在任何時候該方法返回Task都不允許 await關鍵字,就像迭代器 可以返回任何返回IEnumerable的方法一樣。

我確定有一個很好的理由,我只是想明白爲什麼上述建議是不可能的。

+8

我的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

+1

需要在不同位置使用兩個關鍵字來實現一個新功能,這似乎是一個糟糕的設計選擇。事實上,很多人問這個問題意味着(對我)做出錯誤的選擇。通過博客中的所有推理,我可以遵循邏輯,但妥協並不總是最好的計劃。有時候最好打破一些代碼並繼續前進。 – adelphus 2012-02-10 10:34:49

+1

我個人認爲是最安全的選擇。如果破壞代碼和不破壞代碼之間的所有內容都是簡單的關鍵字,那麼這不是一項太繁重的任務。人們可能會對此發表看法,但可以假設他們不會遇到向後兼容性問題。許多同意或不偏不倚的人不會發聲。 – 2012-02-10 11:04:32

回答

15

我想也許這篇文章涵蓋了一個道理:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx

第一款規定:

什麼激發了設計決策

許多人問我 要求任何方法其中包含一個「await」表達式,其前綴爲 ,上下文關鍵字爲「async」。

它的結論:

這一大堆的利弊;在對其全部進行了評估之後,還有大量的玩家正在玩這個原型編譯器,以瞭解它的感受,C#設計師決定要求一個包含「await」的方法需要「異步」。我認爲這是一個合理的選擇。

它的缺點是向後兼容。

延伸閱讀:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx

+4

+1。引用Eric Lippert是* * * Eric Lippert的下一個最好的東西:) – Benjol 2012-02-10 14:04:30

+8

我只想補充一點,我非常希望C#2設計人員決定在每個預期方法的開始處放置「迭代器」或一些類似的關鍵字成爲一個迭代器。在知道它是否爲迭代器塊之前,必須解析*可能是整個方法體*是非常令人頭疼的。 – 2012-02-10 17:08:29

+1

更不用說它會允許匿名方法成爲迭代器了。 – 2012-08-07 12:41:04

8

對於我來說,最引人注目的原因是return句話的意思時,功能變得async變化。如果沒有asnycreturn x的意思是「價值x返回任務」,並與異步這意味着「任務的結果集x

2

前一陣子我在我的博客寫了一個summary of async/await keyword questions

這裏的部分「推斷async」的結論:

埃裏克利珀有關於這個主題的definitive post。這也在blog comments,Channel9forums中討論過。

總而言之,一個單詞await關鍵字將是一個突破性變化太大。選擇是在等待多字(例如,await for)或方法(async)上的關鍵字之間進行,該關鍵字將在該方法內啓用await關鍵字。明確標記方法async對於人類和計算機來說都更容易解析,因此他們決定使用async/await對。