我有一个遗留的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();