使用PCL编写异步/等待WCF客户端

7
我正在从事的项目在服务器端使用WCF服务(代码在同一项目中)。我想通过编写一个消费该服务的PCL来扩展它,并希望使用Async/Await模式实现调用。
由于PCL最初不支持Async/Await,因此我通过Nuget向项目添加了BCL.Async包。但是,每当我尝试生成代理时,无法选择基于任务的异步客户端即无法生成。在PCL中似乎也无法通过ChannelFactory手动添加代理。
我的当前方法是生成代理并复制引用类,然后使用TPL提供的Task包装器自己编写async/await模式。但是有没有更简单的方法?如何直接使用async/await模式手动编写包装器而不生成具有相同效果的多个async模式?

1
不要使用TPL/Task.Run来“包装”你的WCF调用。这样做并不能实现真正的无线程异步,而如果你确实在嵌入式设备上工作,这将会产生巨大的影响。但是你可以使用Task.Factory.FromAsync(BeginXXX,EndXXX)方法……这样可以正确地工作。 - Aron
@Aron,感谢您的建议。TPL链接实际上直接进入了您提到的方法,所以我想那应该是正确的路径,除非我可以以某种方式编写/生成基于任务的WCF客户端... - Mark
我知道两种方法。第一种是为您的接口使用直接引用(而不是WSDL)(当您的客户端和服务器从同一个repo开发时,我建议使用此方法)。第二种是使用“partial”关键字手动添加异步方法。 - Aron
@Mark - 你有得到任何合适的答案吗?可以和我们分享一下吗?我也卡在这种情况下了!... - Dennis Jose
@Dennis 我还没有找到解决办法.. 但是一旦我有一个可行的解决方案,我会发布更新.. - Mark
显示剩余2条评论
2个回答

3
最终我生成了代理,手动使用TaskFactory来包装生成的APM模型,在PCL中为客户端生成Async/Await模式。这篇博客文章中有详细说明。
注:已修复链接错误。

1
你的链接已经失效:( - Sergey Metlov

0

不要使用/async参数。它用于生成旧式APM方法。随.NET 4.5一起提供的scvutil版本默认生成Task方法。 - Panagiotis Kanavos
@PanagiotisKanavos,我还没有测试这个方法,但是我基于上面提到的.NET 4.5文档编写了它。这是一个新功能吗?因为文档中说默认值是相反的。 - Oakcool
这并不是一件新鲜事,这就是它的工作原理。文档并不清晰,甚至没有包含所有的参数。命令行帮助中指出:“生成同步和开始/结束异步方法签名。默认情况下,生成同步和基于任务的异步方法签名。”甚至还有一个/syncOnly开关,用于阻止生成任何类型的异步代码。 - Panagiotis Kanavos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接