2012-02-02 73 views
136

我目前正在開始創建一個應用程序,它將從C#5的異步等待功能中獲益頗多。但我不確定要使用哪個版本的VS和異步運行時。看看OS流行度圖表,我需要再支持Windows XP三年左右。它看起來像.net 4.5只運行在較新版本的Windows上,所以我需要定位.net 4.0。開發機器使用Windows 7,因此使用更新版本的VS並不是問題。在.net上使用async-await 4

現在我需要先選擇一個編譯器這樣做的:

  • VS2010與AsyncCTP
  • VS2012預覽(也是最後一次到達),設定目標到.NET 4.0
  • 單聲道(貌似2.12具有異步的await,我更喜歡/我習慣了在VS作爲的MonoDevelop IDE)

哪一個具有更少的代碼生成錯誤?看看Jon Skeet's blog VS2012 Preview使用的是一個永不代碼生成器,而不是CTP。

更重要的是哪個運行時使用?

VS2012是否包含與.net 4一起使用的可再發行異步運行時?

我設法通過引用AsyncCTP運行時來預覽編譯代碼。但由於CTP具有奇怪的許可條件,這看起來不是一個好的長期解決方案。

或者我應該使用第三方實施?也許mono有一個?

爲了分發庫,我更喜歡簡單地將dll放在與應用程序相同的目錄中,而不是某種安裝程序。

如果我的二進制文件在mono + Linux/MacOS上沒有變化,我也會喜歡它。所以運行時應該與任何單聲道(可能是2.12)內置的兼容,或者允許在非Windows操作系統上使用。

+1

我不認爲你會得到一個CTP版本太遠,因爲你將不被允許重新分配任何CTP與商業應用程序的一部分。肯定有潛伏的錯誤,並且它的性能還沒有優化。您可能會更快地開發它,但您的客戶不會樂意安裝可能干擾最終發佈版本的測試版軟件。 – 2012-02-05 07:39:51

+0

@Alois AsyncCTP的更高版本允許重新分發。可能發生的最糟糕的事情是我的應用程序中斷。這並不是因爲它可能會干擾其他應用程序,所以我看不出您的音樂會是否會干擾最終版本。另外我的問題的一部分是,如果將來有最終版本支持WinXP的話。 – CodesInChaos 2012-02-06 22:33:29

回答

105

微軟發佈了Async Targeting Pack (Microsoft.Bcl.Async)通過Nuget作爲AsyncCTP的替代品。

您可以在這裏閱讀更多關於:http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx

您可以在這裏閱讀以前的版本:http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx

由於此包已官方支持,我現在認爲針對XP +異步的最佳選擇是使用Visual Studio 2012 + C#5 +異步定位包。

如果您覺得需要以.NET 3.5爲目標,您仍然可以使用(我的)AsyncBridge for .NET 3.5

+0

我無法找到您的AsyncBridge許可證的任何參考? – toong 2013-03-19 13:30:57

+1

請點擊此處查看:https://github.com/OmerMor/AsyncBridge/blob/master/src/AsyncBridge/readme.txt – 2013-03-20 09:53:20

+14

請記住,在.NET 4.0上使用異步定位包需要安裝KB2468871。 – ghord 2013-08-21 06:32:08

2

如果您想在MS發佈C#5.0之後開始分發您的軟件,那麼您可以使用AsycnCTP開始開發。 否則我不會推薦你使用它,因爲它只是CTP,甚至不是測試版。它可以在測試階段和發佈版本中進行很多改變。它可能是不穩定的,等等。

如果你想在你的應用程序中引入簡單的異步操作,我會建議你使用Reactive Extensions和頂層的東西(Reactive UI等),它只是美化。

至於VS2012,它還包含相同的異步CTP,據我記得從我的/ Build/tablet MS給我的那次會議。

+1

我不在乎等待VS2012的發佈。我希望VS2012在我的軟件不在alpha版本之前發佈。但即使一次發佈VS2012,我也不想瞄準.net 4.5,因爲WinXP似乎沒有這個功能。所以主要的問題是在.net 4上使用異步運行時。 – CodesInChaos 2012-02-06 11:15:20

3

如果您希望能夠分發您的軟件,我認爲Mono解決方案現在是您唯一的選擇。你也可以說你希望最終的結果能夠在Mono上運行在Linux和OS X上。將Mono作爲開始看起來就像是自然的解決方案。

您的下一個問題是IDE。 MonoDevelop顯然工作得很好,但是你說你更喜歡Visual Studio。

Greg Hurlman created a profile用於從Visual Studio對Mono 2.8進行編碼。如果你跟進他,他可能會指出你在Visual Studio中針對Mono 2.11/2.12開發的正確方向。

當然,也有Mono Tools for Visual Studio這是一個商業產品。我認爲它仍然由Xamarin提供。

你也許能夠在.NET之上運行Mono所需的4.5個配置文件程序集,但我沒有嘗試過。 4.5配置文件是4.0 API的嚴格超集。也許給它一個鏡頭並回報。

編輯:它看起來像你或許可以在生產中使用Visual Studio異步CTP現在

下面是你應該說的download page

包括一個新的EULA用於生產。注 - 此許可證不包含 構成鼓勵您使用CTP爲您的生產 代碼。 CTP仍然是一個不受支持和使用自有風險的技術預覽版。但是,我們收到很多來自 開發者的請求,要求使用CTP生產代碼,因此已經更改了 許可證以允許這樣做。

+0

我在開發中使用的是小問題。主要問題是我應該交給我的WinXP用戶。你是否建議使用我的應用程序捆綁單聲道2.12? – CodesInChaos 2012-02-08 09:37:50

+0

昨天我查看了單聲道音源,並且至少有幾個核心異步類('Async ... Builder'和'... Awaiter')很難與其他單聲道分離。目前我正在研究重新實現'AsyncCtpLibrary',可能從mono中借用一些。 – CodesInChaos 2012-02-08 09:40:17

+0

關於重新分配'AsyncCtpLibrary',我知道原則上是可能的,但是對於一個許可證包含一些奇怪的子句。但是我的主要問題是長遠來看會發生什麼。如果它變得不受支持,並且沒有人修復其中的錯誤,那可能很煩人。 – CodesInChaos 2012-02-08 09:42:35

24

如果您願意考慮其他.Net語言,F#可以解決您的問題。它具有多年的async {}計算表達式,即使使用.Net 2.0也可以向後兼容。最低要求是Windows XP SP3。運行時可以下載here

3

可以使用VS 12 beta來使用async/await來定位.NET 4.0。

您需要將一些代碼複製到提供編譯器依賴的類型的項目中。

詳細here

編輯:我們已經採取了這一技術,並把它變成所謂AsyncBridge一個開放源碼庫: https://nuget.org/packages/AsyncBridge