WCF异步调用返回void并且是OneWay

时间:2013-04-30 11:19:11

标签: wcf asynchronous iasyncresult

我使用WCF在两个进程之间进行异步通信 到目前为止,我实现了IAsyncResult模式,并通过3种方法实现: BeginOperation - client.BeginOperation,当服务接收它时,在线程池上的作业与委托的队列进行操作
操作 - 在服务端运行
EndOperation - 这是客户端回调。

我的问题是,我想从客户端发送字符串到服务,我希望发送是异步的,我不想得到响应 - 只是希望服务打印字符串。
这够了吗 ?这必须是非阻止

    [OperationContract(IsOneWay = true)]
    void PrintString(string message);

或者我需要做如下:

    [OperationContract(IsOneWay = true, AsyncPattern=true)]
    void BeginPrintString(string message, AsyncCallback callback, object state);
    void EndPrintString(IAsyncResult asyncResult);

2 个答案:

答案 0 :(得分:3)

IsOneWay应该足够了,但在特定情况下仍然可以阻止您的客户端,以及抛出错误。

有关详细信息,请参阅thisthis帖子:

  

关于OneWay操作应该记住的一般事项 -

     

O / W操作必须返回void。 O / W操作仍然可以产生   例外。在客户端通道上调用操作可能仍然存在   如果它无法将呼叫传输到,则抛出异常   服务。 O / W操作仍然可以阻止。如果服务是抽水的话   消息和队列已经启动,调用O / W操作可能会阻止您的操作   以下代码。

答案 1 :(得分:-1)

通过使用单独的线程来完成工作,可以使其更加异步。

而不是:

public void MyOneWayServiceOperation() {
   // do stuff
}

做类似的事情:

public void MyOneWayServiceOperation() {
   new Thread(() => {
      // do stuff
   }).Start();
}

无论如何,服务操作都将在新线程上执行,因此不应再导致代码出现在另一个新线程上的问题。

如果您希望在开始之前完成服务操作,则可以在工作之前添加Thread.Sleep()来电。这允许我从服务操作中退出服务而不会抛出异常。