如何:以异步方式调用 WCF 服务操作
本主题介绍客户端如何以异步方式访问服务操作。本主题中的服务可实现 ICalculator
接口。通过使用事件驱动的异步调用模型,客户端可以对此接口异步调用操作。(有关基于事件的异步调用模型的更多信息,请参见Multithreaded Programming with the Event-based Asynchronous Pattern)。有关演示如何在服务中异步实现操作的示例,请参见如何:实现异步服务操作。有关同步操作和异步操作的更多信息,请参见同步和异步操作。
提示
使用 ChannelFactory 时,不支持事件驱动的异步调用模型。有关使用 ChannelFactory 进行异步调用的信息,请参见如何:使用通道工厂以异步方式调用操作。
过程
以异步方式调用 WCF 服务操作
运行同时带有 /async 和 /tcv:Version35 命令选项的 ServiceModel Metadata Utility Tool (Svcutil.exe) 工具,如下面的命令所示。
svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8000/servicemodelsamples/service/mex /a /tcv:Version35
除了同步操作和基于委托的标准异步操作之外,此操作还会生成 WCF 客户端类,其中包含以下内容:
- 两个与基于事件的异步调用方法一起使用的 <operationName>Async 操作。例如:
- 与基于事件的异步调用方法一起使用且形式为 <operationName>Completed 的操作完成事件。例如:
- 与基于事件的异步调用方法一起使用的每个操作的 System.EventArgs 类型(形式为 <operationName>CompletedEventArgs)。例如:
在调用应用程序中,创建一个要在异步操作完成时调用的回调方法,如下面的示例代码所示。
调用该操作之前,请使用 <operationName>EventArgs 类型的新泛型 System.EventHandler,将处理程序方法(在上一步中创建)添加到 <operationName>Completed 事件。然后,调用 <operationName>Async 方法。例如:
示例
提示
基于事件的异步模型设计准则规定,如果返回了多个值,则一个值会作为 Result 属性返回,其他值会作为 EventArgs 对象上的属性返回。因此产生的结果之一是,如果客户端使用基于事件的异步命令选项导入元数据,且该操作返回多个值,则默认的 EventArgs 对象返回一个值作为 Result 属性,返回的其余值是 EventArgs 对象的属性。如果要将消息对象作为 Result 属性来接收并要使返回的值作为该对象上的属性,请使用 /messageContract 命令选项。这会生成一个签名,该签名会将响应消息作为 EventArgs 对象上的 Result 属性返回。然后,所有内部返回值就都是响应消息对象的属性了。