【问题标题】:Async/Await WCF client in a PCLPCL 中的异步/等待 WCF 客户端
【发布时间】:2014-02-18 06:41:15
【问题描述】:

我正在处理的项目在服务器端使用 WCF 服务(代码在同一个项目中)。我想通过编写一个使用服务的 PCL 来扩展它,并希望使用 Async/Await 模式实现调用。

由于 PCL 从一开始就不支持 Async/Await,因此我通过 Nuget 将 BCL.Async 包添加到项目中。但是每当我尝试生成代理时,无法选择基于任务的异步客户端,即生成。在 PCL 中似乎也无法通过 ChannelFactory 手动添加代理。

我当前的方法是生成代理复制 ref 类,然后使用TPL 提供的任务包装器自己编写异步/等待模式。但是有没有更简单的方法?如何直接使用 async/await 模式手动编写包装器而不生成多个具有相同效果的异步模式?

【问题讨论】:

  • 不要使用 TPL/Task.Run 来“包装”您的 WCF 调用。你没有做真正的无线程异步,假设你实际上是在嵌入式设备上工作,这将产生巨大的影响。但是,您可以使用 Task.Factory.FromAsync(BeginXXX,EndXXX) 方法……它可以正常工作。
  • @Aron,感谢您的意见。 TPL 链接实际上直接指向您提到的方法,所以我想这将是正确的路径,除非我可以以某种方式编写/生成基于任务的 wcf 客户端..
  • 我知道有两种方法。第一个是为您的接口使用直接引用(而不是 WSDL)(我建议,当您的客户端和服务器是从同一个 repo 开发时)。第二种,使用partial关键字手动添加异步方法。
  • @Mark - 你得到任何正确的答案了吗?你能和我们分享吗?我也被这种情况困住了!...
  • @Dennis 我还不在那里.. 但是一旦我有一个可行的解决方案,我会发布更新..

标签: c# wcf async-await portable-class-library


【解决方案1】:

最后,我生成了代理,并使用 TaskFactory 手动包装了生成的 APM 模型,以在 PCL 内的客户端中生成 Async/Await 模式。我写在这个blog post

编辑:更新了断开的链接。

【讨论】:

  • 您的链接已损坏 :(
【解决方案2】:

您是否尝试过在 svcUtil.exe 工具中使用 /async 参数?

在此处查看更多信息ServiceModel Metadata Utility Tool (Svcutil.exe)

【讨论】:

  • 不要使用 /async 参数。它用于生成旧式 APM 方法。 .NET 4.5自带的scvutil版本默认生成Task方法
  • @PanagiotisKanavos,我没有测试过这个方法,我基于上面的文档,它指向 .NET 4.5 文档。这是新事物吗,因为文档说默认值是相反的。
  • 这不是什么新鲜事物,它就是这样运作的。文档不清楚,甚至不包含所有参数。命令行帮助声明:“同时生成同步和开始/结束异步方法签名。默认值:生成同步和基于任务的异步方法签名。” 甚至还有一个 /syncOnly 开关来防止生成任何一种异步代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多