2013-04-30 64 views
1

我使用WCF在2个进程之间进行异步通信。
到现在我实现了IAsyncResult的模式,并且通过具有3种方法做到了:
BeginOperation - client.BeginOperation,当服务收到队列中的作业上的线程池与委托操作
操作 - 在服务端
EndOperation运行 - 这是客户端回调。WCF异步调用,返回void并且是OneWay

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

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

或者我需要做如下:

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

回答

3

IsOneWay应该够了,但它仍然可以您在特定环境下的客户端,以及如抛出错误。

详情参见thisthis帖子:

一般的东西,你应该记住关于单向操作 -

O/W操作必须返回void。 O/W操作仍然可以产生异常。调用客户端通道上的操作时,如果它不能将呼叫转移到 服务,它仍然可能会发出异常 。 O/W操作仍然可以阻止。如果服务的消息中有 消息且队列已启动,则调用O/W操作可能会阻止您的 以下代码。

+0

IsOneWay如果明确写明:O/W操作仍然可以阻塞,那么它就足够了。如果服务被消息传输并且队列已经启动,调用O/W操作可能会阻止您的后续代码。 – ilansch 2013-04-30 13:49:39

+0

这取决于您的使用/需求。例如,如果您每小时调用一次服务器,并且对100个并发调用进行了限制,我会考虑检查配置和用例(是的,仍然会发生),以测量阻止/等待客户端的可能性。 – evgenyl 2013-04-30 13:54:42

+0

这是我的日志服务,这意味着5-10个不同的进程将使用客户端调用进行日志记录。每个进程都有wcf客户端发送字符串消息进行登录。该服务将会记录该字符串。从多个客户端不断记录和服务是单一 – ilansch 2013-04-30 14:00:16

-1

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

相反的:

public void MyOneWayServiceOperation() { 
    // do stuff 
} 

做这样的事情:

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

的服务操作将被一个新的线程中执行,无论如何,所以它应该不会造成任何更多的问题,为您的代码在不同的新线程上。

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