我使用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);
答案 0 :(得分:3)
IsOneWay应该足够了,但在特定情况下仍然可以阻止您的客户端,以及抛出错误。
关于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()
来电。这允许我从服务操作中退出服务而不会抛出异常。