Async/await for compact framework v3.5-手动实现



我必须为WinCE 5.0开发一个应用程序,该应用程序与一个常规的PC应用程序通信/同步数据,该应用提供了一个我可以与移动(工业)设备交谈的网络服务。

由于很明显会导致代码难以在移动设备侧维护(检查连接→完成后:检查Web服务的可用性→完成后:检查移动设备是否符合同步条件→完成后开始交换数据)我很想使用await s的同步编程方式。

我发现了Daniel Grunwald的一些代码片段,这是编译器为异步/等待功能所需的东西的最小实现。例如,再加上实现Task类型的Task Parallel Library for.Net 3.5(由于某些调用的方法不具有所需的签名,我不得不对其稍作更改),它看起来很有前景。

到目前为止,解决方案还没有构建,因为我缺少TaskCompletionSource的实现。我用ILSpy反编译了最近的mscorlib,但代码不可用-使用了太多CF中没有的类型。

在这一点上,我想知道这个项目是否注定会失败,因为我永远不会说服VS 2008(我必须使用它来针对智能设备)使用C#编译器(也许有一个变通方法?),或者CF缺乏TaskCompletionSource的关键类型(我可能需要它,因为我想让事件不可用),或者TPL3.5+Grunwald的snippet+TCS实现将构建,但永远不会实际工作。

能请更有经验的人来评估我的意图吗?很乐意听取您的意见、想法和其他方法。谢谢

更新Aaron Stainback的帖子表明,应该可以使用VS2012构建CF 3.5。这至少应该解决编译器问题。

您可以使用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 Assemblys\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核心类库项目,并以"net35cf"框架为目标。

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

示例项目位于:https://github.com/WindowsCE/System.Collections.Immutable

免责声明:我是上述包和项目的作者。

我认为,将对async-await的支持添加到一个本机不支持它的平台上应该是可行的,因为这正是Microsoft.Bcl.Async为.Net 4.0所做的。

但使用async-await需要支持它的编译器,这是没有办法的。这意味着使用AsyncCTP的VS2012或VS2010(但我不建议这样做,这不是生产质量)。据我所知,VS2008无法实现这一点。

还有一种可能是使用Mono,但我不知道它是否支持WinCE。

最新更新