【问题标题】:Creating asynchronous WCF clients without using Service References在不使用服务引用的情况下创建异步 WCF 客户端
【发布时间】:2010-11-09 23:34:23
【问题描述】:

目前我不使用服务引用,因为我觉得它自动生成的代码比我需要的要重。相反,我通过执行以下操作生成代理类:

public class MyClient : ClientBase<IMyService>, IMyService

这对我来说非常有用,没有生成代理类,所以我重用了相同的数据类型。但这只能让我创建同步客户端方法。

生成异步版本需要什么?我已经查看了添加服务引用会执行的自动生成代码,它看起来像样板文件太多了。大量的 begin/end/onbegin/oncomplete 关联事件 arg 数据类型等。

有没有一种更简单的方法来创建异步客户端方法所需的脚手架更少? 我的最终目标是能够在 web 服务客户端上使用新的 c# 5 async/await 关键字

【问题讨论】:

  • 你如何测量这个“重量”?你做过一些性能分析吗?
  • 当我说重量时,我不是指性能损失,而只是生成的代码量。我更喜欢更干净的东西

标签: c# wcf asynchronous


【解决方案1】:

您始终可以编写与 IMyService 完全相同的合约 IMyAsyncService,但使用 Begin/End 异步模式(并使用 [ServiceContract(Name="IMyService")] 保持相同的名称)。它将是相同的电汇合约,并且可以与ClientBase 一起使用,但现在您可以使用await 的异步方法。

【讨论】:

  • 我也想过这个问题,但是我看了一些在服务器端实现异步模式的示例,您仍然需要为每个 Begin/End 创建一堆自定义 AsyncResult 类型对...对我来说似乎不那么干净。
  • 该方法的实际“工作”也发生在您的自定义类型中,而不是在 Begin 或 End 块中,因此它进一步将方法的意图与实现分开
  • 您不需要在服务器上执行此操作,只需在客户端上执行此操作。保持服务器和 IMyService 不变。只需添加一个新的异步客户端合同类型。它将与服务器兼容,但使用异步模式。
  • 我可能不得不走这条路..我希望不必维护单独的客户端接口合同,因为它可能与服务接口合同不同步,但我可能别无选择。按照您建议的方式进行操作,我不必生成代理数据类型,这是最大的胜利
  • 我没有意识到异步调用 WCF 服务这么简单。试了一下,效果很好。非常感谢!
【解决方案2】:

我想添加这个 [OperationContract(IsOneWay = true)]

在你的服务接口中的方法声明将决定它的异步性。

【讨论】:

    【解决方案3】:

    async/await 的 CTP 只是对这些功能支持的预览。他们计划将它们完全集成到 WCF 中。

    http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-with-async-await.aspx

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多