2014-02-18 31 views
7

我正在使用的项目是在服务器端使用WCF服务(代码位于同一项目中)。我想通过编写一个使用该服务的PCL来扩展它,并希望使用Async/Await模式实现调用。异步/等待PCL中的WCF客户端

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

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

+1

不要使用TPL /'Task.Run'来“包装”你的WCF调用。你不是在做真正的无线异步操作,假设你实际上在嵌入式设备上工作,这将会产生巨大的影响。但是,您可以使用'Task.Factory.FromAsync(BeginXXX,EndXXX)'方法......这样可以正常工作。 – Aron

+0

@Aron,感谢您的输入。 TPL链接实际上符合你提到的方法,所以我想这将是正确的路径,除了我可以以某种方式写/生成基于wcf客户端的任务。 – Mark

+0

我知道有两种方法。首先,为您的接口使用直接引用(与WSDL相对)(我建议,当您的客户端和服务器从相同的回购开发时)。其次,是使用'partial'关键字手动添加异步方法。 – Aron

回答

3

最后,我生成的代理并手动包裹所生成的APM模型与TaskFactory以在PCL内的客户端的异步/等待模式。我在这里写下了这个blog post

编辑:更新断开的链接。

+1

您的链接已损坏:( –

+0

@SergeyMetlov对不起,很久以前,但链接再次工作... – Mark

0

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

详见这里ServiceModel Metadata Utility Tool (Svcutil.exe)

+0

*不要*使用/ async参数。它用于生成旧式的APM方法。 .NET 4.5自带的scvutil版本默认生成任务方法 –

+0

@PanagiotisKanavos,我没有测试过这个方法,我基于上面指向.NET 4.5文档的文档。这是一个新事物,因为文档说默认是相反的。 – Oakcool

+0

这不是一个新事物,它是如何工作的。文档不清楚,甚至没有包含所有参数。命令行帮助指出:_“生成同步和开始/结束异步方法签名。默认:生成同步和基于任务的异步方法签名。”_甚至还有一个/ syncOnly开关,用于防止生成任何类型的异步代码 –