簡體   English   中英

WCF:回調不是異步的

[英]WCF: Callback is not asynchronous

我正在嘗試根據WCF提供的回調基礎結構對客戶端服務器進行編程,但是它不能異步工作。

我的客戶端連接到服務器,並調用登錄方法,在此我通過執行以下操作保存了客戶端的回調通道

MyCallback callback = 
      OperationContext.Current.GetCallbackChannel<MyNamespace.MyCallback>()

之后,服務器進行一些處理,並使用回調對象與客戶端進行通信。

所有這些工作正常,問題仍然存在於以下事實:即使我在OperationContract中將方法設置為IsOneWay=true ,但在對客戶端進行調用時服務器仍然掛起。

我已經通過在Visual Studio中啟動服務器進行調試,分離,啟動客戶端,調用上述登錄方法,在客戶端的已實現回調方法中設置斷點以及使服務器發送響應來進行測試給客戶。 服務器停止執行應做的工作,等待客戶端的響應。

任何幫助表示贊賞。

訣竅是從服務器異步調用回調。 看這個:

    [OperationContract(IsOneWay = true, AsyncPattern = true)]
    IAsyncResult BeginOnMessageReceived(LiveDataMessage message, AsyncCallback acb, object state);
    void EndOnMessageReceived(IAsyncResult iar);

您是否嘗試設定

[CallbackBehavior(UseSynchronizationContext = false)]

在實現回調接口的客戶端對象上?

我認為解決您的問題的方法是為您的服務正確設置'ConcurecyMode'和'Instance ContextMode'屬性。 為此,您必須使用以下屬性裝飾服務聲明,如以下示例所示:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
    public class SubscriberService: ISubscriberServiceContract
{...}

InstanceContextMode.Single將您的服務構建為Singleton對象,因此對於所有客戶端,只有一個服務實例在運行;

ConcurencyMode.Reentrant或ConcurencyMode.Multiple為服務實例啟用多線程工作。 對於“多個”,必須在服務中注意線程同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM