2014-02-27 65 views
10

Microsoft.Bcl.Async使開發人員能夠使用沒有.NET Framework 4.5的async/await關鍵字,它們應該用於使用它們。Microsoft.Bcl.Async如何工作?

這真是太好了,這要歸功於Microsoft CLR和語言團隊中人員非常努力的工作。

現在我很好奇這是如何工作的。

async/await要求編譯器做一些繁重的工作,將代碼轉換成可以等待操作的東西。

編譯器最初拋出編譯下的.NET Framework 4.0的錯誤,即使它清楚地知道什麼async/await平均(Visual Studio的2012/2013)。

那麼,這怎樣庫告訴編譯器不要把具體編譯與異步操作相關的錯誤,並像.NET Framework 4.5一樣進行一些代碼提升?

+0

我編輯只是一個更多的時間來從導致引起改變你不能「與4.0編譯錯誤」。但仍然感謝編輯。 –

回答

10

async/await無非是C#5.0編譯器轉換。沒有async/awaitIL級別。

一個簡單的例子是using() { }語句,它也是一個編譯器轉換。它只是將using語句轉換爲try/finally塊。但是,依賴於.NET 1.1中定義的接口IDisposable的存在。

同樣,async/await轉換取決於某些類型,如在.NET 4.5中定義的IAsyncStateMachine接口。 Microsoft.Bcl.Async將這些類型定義轉換爲.NET 4.0。

編輯

怎樣的Microsoft.Bcl.Async組件會導致編譯器來識別新的關鍵字(異步/等待)?

不,它不。 C#5.0編譯器已經知道關鍵字以及如何處理它們。但是,由於項目針對.NET 4.0,因此無法找到所需的類型。 Microsoft.Bcl.Async包帶來了這些類型。

+0

謝謝。但是,Microsoft.Bcl.Async如何告訴編譯器使用它們自己的IAsyncStateMachine類型來代替它?我認爲編譯器總是尋找指定的類型來操作異步/等待? –

+3

對,'Microsoft.Bcl.Async'具有與.NET 4.5中定義的相同的名稱空間和相同的類型名稱。 – YK1

+0

非常感謝你的回答。 –

-3

MS2012是安裝.NET 4.5,以便您描述

+0

雖然4.5是VS2012中的新默認值,但您仍然可以使用.NET 4.0進行開發,其中編譯器**會引發錯誤。 VS2010和VS2012唯一的區別在於錯誤描述。 –

+0

我確實得到了編譯器錯誤4.0,但肯定錯誤不是異步/等待,但缺少某些類型,如System.Runtime.CompilerServices.IAsyncStateMachine。我很感激。 –