2013-04-30 37 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()呼叫。這使我可以從服務操作中退出服務而不會拋出異常。