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();

WCF中的单向异步/等待调用

首先,客户机与服务器是完全分离的。客户端和服务器都可以是同步的,可以使用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使您能够等待实际的消息被发送(如果有延迟)并检测信道通信错误(如果您正在使用可靠的信道)。