1

我使用 WCF 在 2 个进程之间进行异步通信。
到目前为止,我实现了 IAsyncResult 模式,并通过 3 个方法来实现:
BeginOperation - client.BeginOperation,当服务接收到它时,将线程池上的作业与 Operation
Operation 委托进行排队 - 在服务端
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);
4

2 回答 2

3

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

有关更多详细信息,请参阅帖子和帖子:

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

O/W 操作必须返回 void。O/W 操作仍然可以产生异常。如果无法将调用传输到服务,则在客户端通道上调用操作可能仍会引发异常。O/W 操作仍然可以阻塞。如果服务已被消息抽出并且队列已启动,则调用 O/W 操作可能会阻塞您的以下代码。

于 2013-04-30T12:10:45.963 回答
-1

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

代替:

public void MyOneWayServiceOperation() {
   // do stuff
}

做类似的事情:

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

无论如何,服务操作都将在新线程上执行,因此您的代码在不同的新线程上应该不会导致任何问题。

Thread.Sleep()如果您希望在开始之前完成服务操作,您可以在工作之前添加呼叫。这使我可以从服务操作中退出服务,而不会引发异常。

于 2014-07-17T01:10:11.127 回答