WCF中的单向异步/等待调用
本文关键字:等待 调用 异步 WCF | 更新日期: 2023-09-27 18:03:54
我有一个遗留的WCF服务,其中有许多以最经典的方式实现的单向操作契约:
// The interface
[OperationContract(IsOneWay = true, AsyncPattern = true)]
IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState);
void EndFinalizePublishing(IAsyncResult result);
// The service
public IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState)
{...}
所以这里一切都很好,现在我需要将其转换为c# 5最新的async/await模式。注意操作的单向性质。我的问题:
- 我想我需要从
OperationContract
属性中删除AsyncPattern = true
。 - 将
IAsyncResult
返回类型替换为接口中的void
和类中的async void
。 - 为了方便,删除Begin/End并添加Async后缀。
现在我应该如何从客户端调用单向操作呢?客户端对单向调用不使用async/await ?
这是否正确,是否会在客户端导致真正的异步处理。
// The proxy
public void FinalizePublishingAsync(PageContent pageContent)
{
Channel.FinalizePublishingAsync(pageContent);
}
// The consumer of the client
// No way to use await for void methods.
IComPublisherFinalizerClient cl = new IComPublisherFinalizerClient();
cl.FinalizePublishingAsync(content);
cl.Close();
首先,客户机与服务器是完全分离的。客户端和服务器都可以是同步的,可以使用IAsyncResult
(APM)异步代码,也可以使用async
(TAP)异步代码。
其次,服务器端的async
方法应该返回Task
,即使是单向通信。与返回void
的同步方法等效的async
方法是async Task
方法,而不是async void
方法。async void
在WCF服务中特别危险,因为它可能违反ConcurrencyMode
。
- 删除
OperationContract.AsyncPattern
. - 将
Begin*
/End*
方法组合成单个*Async
方法,返回Task
。
您的客户端应该在其代理的接口上看到Task
-返回方法,它应该是await
。这并不意味着你在等待回应;这个await
使您能够等待实际的消息被发送(如果有延迟)并检测信道通信错误(如果您正在使用可靠的信道)。