c# – WCF中的单向异步/等待调用
我有一个传统的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,object asyncState) {...} 所以一切都运行正常,现在我需要将其转换为c#5最新的async / await模式.注意操作的单向性.我的问题: >我想我需要从OperationContract属性中删除AsyncPattern = true. 现在我该如何从客户端调用单向操作? 这是正确的,将导致客户端的真正异步处理. // 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)异步代码,或使用异步(TAP)异步代码.
其次,服务器端的异步方法应该返回Task,即使是单向通信也是如此.返回void的同步方法的异步等效项是异步Task方法,而不是异步void方法. async void在WCF服务中特别危险,因为它可能违反ConcurrencyMode. 所以你的服务器端步骤看起来像这样: >删除OperationContract.AsyncPattern. 您的客户端应该在接口上看到任务返回方法,它应该等待它的代理.这并不意味着你在等待回应;此等待使您可以等待发送实际消息(如果有延迟)并检测通道通信错误(如果您使用的是可靠通道). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |