Async/await for compact framework v3.5 - 手动实现
Posted
技术标签:
【中文标题】Async/await for compact framework v3.5 - 手动实现【英文标题】:Async/await for compact framework v3.5 - manual implementation 【发布时间】:2013-06-20 15:35:09 【问题描述】:我必须为 WinCE 5.0 开发一个应用程序,该应用程序与常规 PC 应用程序通信/同步数据,该应用程序提供可以与我的移动(工业)设备通信的 Web 服务。
由于很明显会导致代码在移动设备端难以维护(检查连接→完成时:检查Web服务可用性→完成时:检查移动设备是否符合同步条件→完成时开始交换数据)我很想使用await
s 的同步编程方式。
我找到了 Daniel Grunwald 的一些 code snippet,这是编译器为 async/await 功能所需的东西的最小实现。例如,与实现 Task 类型的 Task Parallel Library for .Net 3.5 (我不得不稍微改变一下,因为某些调用的方法不存在所需的签名)一起,它看起来很有希望。
到目前为止,解决方案还没有建立,因为我缺少TaskCompletionSource
的实现。我用 ILSpy 反编译了最近的 mscorlib,但代码不可用 - 使用的类型太多,CF 中不存在。
此时我想知道这个项目是否注定会失败,因为我永远不会说服 VS 2008(我必须单独使用它来针对智能设备)使用 C# 5 编译器(也许有解决方法? ),或者 CF 缺少 TaskCompletionSource 的关键类型(我可能需要它,因为我想让事件可等待),或者 TPL3.5 + Grunwald 的 sn-p + TCS 实现将构建但从未实际工作。
能否请更有经验的人评估我的意图?很想听听您的 cmets、想法和替代方法。谢谢。
更新 Aaron Stainback's post 表示应该可以使用 VS2012 构建 CF 3.5。这至少应该解决编译器问题。
【问题讨论】:
嗨,大卫。我已经编写了自己的BackgroundWorker
版本以在我们拥有的移动设备上实现。然而,并行处理需要一个多核处理器,否则它只会在单个进程中运行。除了让这个按书面工作,你的目标是什么?
@jp2code:我想构建一个可维护的项目,在该项目中很容易理解要采取特殊操作所需的事件的级联发生(参见带有 → 符号的部分)。我想我会使用确定性自动机来处理它——实际上 async/await 被编译器转换为 FSM。找到一种“重用”已经实现的机制而不是重新发明***的方法真是太棒了。希望我没有误解你的问题。
【参考方案1】:
您可以按照以下说明使用 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
免责声明:我是上述包和项目的作者。
【讨论】:
【参考方案2】:我认为将对async
-await
的支持添加到本机不支持它的平台应该是可行的,因为这正是 Microsoft.Bcl.Async 为 .Net 4.0 所做的。
但是使用async
-await
需要支持它的编译器,没有办法解决这个问题。这意味着带有异步 CTP 的 VS 2012 或可能的 VS 2010(但我不建议这样做,这不是生产质量)。据我所知,没有办法在 VS 2008 中使用。
还有一种可能是使用 Mono,但我不知道它是否支持 WinCE。
【讨论】:
以上是关于Async/await for compact framework v3.5 - 手动实现的主要内容,如果未能解决你的问题,请参考以下文章
[Node] Catch error for async await