如何:使用通道工厂以异步方式调用操作

本主题介绍客户端如何在使用基于 ChannelFactory 的客户端应用程序时以异步方式访问服务操作。(当使用 System.ServiceModel.ClientBase 对象调用服务时,可以使用事件驱动的异步调用模型。有关更多信息,请参见如何:以异步方式调用 WCF 服务操作。有关基于事件的异步调用模型的更多信息,请参见Multithreaded Programming with the Event-based Asynchronous Pattern。)

本主题中的服务可实现 ICalculator 接口。客户端可以在此接口上以异步方式调用操作,这意味着像 Add 这样的操作将拆分为两个方法:BeginAddEndAdd。前一个方法启动调用,而后一个方法在操作完成时检索结果。有关演示如何在服务中以异步方式实现操作的示例,请参见如何:实现异步服务操作。有关同步和异步操作的详细信息,请参见同步和异步操作

过程

以异步方式调用 WCF 服务操作

  1. 按照下面的命令所示,使用 /async 选项运行 ServiceModel Metadata Utility Tool (Svcutil.exe) 工具。

    svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8000/servicemodelsamples/service/mex /a
    

    这将生成该操作的服务协定的异步客户端版本。

  2. 创建一个异步操作完成时将要调用的回调函数,如下面的示例代码所示。

  3. 若要以异步方式访问服务操作,请创建客户端、调用 Begin[Operation](例如 BeginAdd),并指定一个回调函数,如下面的示例代码所示。

    执行该回调函数时,客户端将调用 End<operation>(例如 EndAdd)以检索结果。

示例

上面过程中的客户端代码使用的服务可实现 ICalculator 接口,如下面的代码所示。在服务端,协定的 AddSubtract 操作由 Windows Communication Foundation (WCF) 运行库以同步方式调用,即使前面的客户端步骤是在客户端以异步方式调用的也是如此。在服务端,MultiplyDivide 操作用于在服务端以异步方式调用服务,即使客户端以同步方式调用这两个操作也是如此。此示例将 AsyncPattern 属性设置为 true。此属性设置与 .NET Framework 异步模式的实现一起,可让运行库以异步方式调用该操作。

另请参见

其他资源

Service Contract: Asynchronous Sample