Dot-Net-3.5

Async/await for compact framework v3.5 - 手動實現

  • April 9, 2020

我必須為 WinCE 5.0 開發一個應用程序,該應用程序與正常 PC 應用程序通信/同步數據,該應用程序提供可以與我的移動(工業)設備通信的 Web 服務。

由於很明顯會導致程式碼難以在移動設備端維護(檢查連接→完成時:檢查網路服務可用性→完成時:檢查移動設備是否符契約步條件→完成時開始交換數據)我很喜歡使用awaits 的同步程式方式。

我找到了 Daniel Grunwald 的一些程式碼片段,它是編譯器為 async/await 功能所需的東西的最小實現。例如,與實現 Task 類型的 .Net 3.5 的任務並行庫(我不得不稍作更改,因為某些呼叫的方法不存在所需的簽名)一起,它看起來很有希望。

到目前為止,解決方案還沒有建立,因為我缺乏TaskCompletionSource. 我用 ILSpy 反編譯了最近的 mscorlib,但程式碼不可用 - CF 中不存在的使用類型太多。

在這一點上,我想知道這個項目是否注定要失敗,因為我永遠不會說服 VS 2008(我必須使用它來定位智能設備)使用 C# 5 編譯器(也許有解決方法?),或者CF 缺少 TaskCompletionSource 的關鍵類型(我可能需要它,因為我想讓事件等待),或者 TPL3.5 + Grunwald 的片段 + TCS 實現將建構但從未真正起作用。

可以請更有經驗的人評估我的意圖嗎?很想听聽您的意見、想法和替代方法。謝謝。

更新 Aaron Stainback 的文章表明應該可以使用 VS2012 建構 CF 3.5。那至少應該解決編譯器問題。

我認為添加對async-的支持await到本機不支持它的平台應該是可行的,因為這正是 Microsoft.Bcl.Async 為 .Net 4.0 所做的。

但是使用async-await需要支持它的編譯器,沒有辦法解決這個問題。這意味著帶有非同步 CTP 的 VS 2012 或可能的 VS 2010(但我不建議這樣做,這不是生產質量)。據我所知,沒有辦法在 VS 2008 上使用它。

另一種可能性是使用 Mono,但我不知道它是否支持 WinCE。

您可以按照以下說明使用 Visual Studio 2015 編譯為 Compact Framework 3.5:

  • 安裝“.NET Compact Framework 3.5 Redistributable”;
  • 從’ C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE ‘複製文件;
  • 將文件粘貼到’ C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v3.5\Profile\CompactFramework ‘目錄;
  • 創建一個名為“ RedistList ”的目錄;
  • 在“ RedistList ”目錄下創建一個名為“ FrameworkList.xml ”的文件;
  • 將以下內容設置為創建的文件:
<?xml version="1.0" encoding="utf-8"?>
<FileList Redist="Net35-CF" Name=".NET Compact Framework 3.5">
</FileList>

現在您可以在 Visual Studio 2015 上創建一個**.NET Core 類庫項目並以“** net35-cf ”框架為目標。

要使用 async/await,您可以使用NETStandard.WindowsCE包。

可以在以下位置找到範例項目:https ://github.com/WindowsCE/System.Collections.Immutable

免責聲明:我是上述包和項目的作者。

引用自:https://stackoverflow.com/questions/17270216