Zar*_*ara 6 .net c# wcf async-await
我有一个传统的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)
{...}
Run Code Online (Sandbox Code Playgroud)
所以一切都运行正常,现在我需要将其转换为c#5最新的async/await模式.注意操作的单向性.我的问题:
AsyncPattern = true从OperationContract属性中删除它.IAsyncResult返回类型替换.voidasync void现在我该如何从客户端调用单向操作? 对于单向呼叫,在客户端右侧没有使用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();
Run Code Online (Sandbox Code Playgroud)
首先,客户端完全独立于服务器.客户端或服务器可以是同步的,使用IAsyncResult(APM)异步代码或使用async(TAP)异步代码.
其次,即使是单向通信,async服务器端的方法也应该返回Task.async返回的同步方法的等价物void是async Task方法,而不是async void方法.async void在WCF服务中特别危险,因为它可能违反了ConcurrencyMode.
所以你的服务器端步骤看起来像这样:
OperationContract.AsyncPattern.Begin*/ End*method对合并到一个*Async返回的方法中Task.您的客户端应该Task在其代理的接口上看到 - 返回方法,它应该这样做await.这并不意味着你在等待回应; 这await使您可以等待发送实际消息(如果有延迟)并检测通道通信错误(如果您使用的是可靠通道).
| 归档时间: |
|
| 查看次数: |
3449 次 |
| 最近记录: |