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.
>将IAsyncResult返回类型替换为接口中的void和类中的async void.
>为方便起见,删除开始/结束并添加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)异步代码,或使用异步(TAP)异步代码.

其次,服务器端的异步方法应该返回Task,即使是单向通信也是如此.返回void的同步方法的异步等效项是异步Task方法,而不是异步void方法. async void在WCF服务中特别危险,因为它可能违反ConcurrencyMode.

所以你的服务器端步骤看起来像这样:

>删除OperationContract.AsyncPattern.
>将Begin * / End *方法对合并为返回Task的单个* Async方法.

您的客户端应该在接口上看到任务返回方法,它应该等待它的代理.这并不意味着你在等待回应;此等待使您可以等待发送实际消息(如果有延迟)并检测通道通信错误(如果您使用的是可靠通道).

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...