2016-01-22 254 views
0

我目前正在開發即時消息應用程序。一旦客戶端連接到服務器併發送一個味精,它工作得很好。第二個客戶端連接,兩個客戶聊天,一切都完美。當兩個客戶端同時發送一個消息時就會出現問題。然後兩個客戶端都凍結(在調試中我得到一個超時),但聊天中的其他客戶端顯示的消息很好。WCF多個客戶端

這是服務器的行爲:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 

的app.config行爲:

<behavior name="Behave"> 
      <serviceThrottling maxConcurrentCalls="100" 
maxConcurrentSessions="100" 
maxConcurrentInstances="100" /> 
      </behavior> 

我是一個新手,當談到WCF,我不知道我完全理解它。我嘗試過改變東西,但似乎沒有任何幫助。任何形式的幫助將不勝感激。 如果需要進一步的代碼,我會根據要求提供。

+0

你是否嘗試更改InstanceContextMode = InstanceContextMode.PerCall? –

+0

@NadeemKhoury我已經試過了,但我需要使用單身。如果我使用PerCall或PerSession,取決於兩者中的哪一個,那麼我的應用程序會變得混亂。會發生什麼情況是,2個客戶端(或任何其他客戶端)將無法聊天,因爲每個客戶端都會創建一個新對象。他們能夠發送消息,即使他們中的任何一個都不會被另一個人看到。我不確定我的解釋是否足夠理解應用程序的行爲,所以請讓我知道它是否不適用。 – Chogart

+0

翻遍一切。這只是2位客戶凍結的UI。這就是它。我認爲問題在於同步。 – Chogart

回答

0

我想你應該調用後臺線程,而不是同一個線程。 這裏是交易:

  1. 你應該定義private SynchronizationContext _SyncContext;

在構造2.and:

_SyncContext = SynchronizationContext .Current; 

3.在您的客戶端添加方法事件這裏面的代碼處理程序。

Thread thread = new Thread(()=> 
{ 

    SendOrPostCallBack callback = new SendOrPostCallback(arg=> 
    { 


    ** your logic here need to be marshalled** 
    } 

    _SyncContext.Send(callback, null); 
} 

告訴我,如果它與你兄弟合作。快樂編碼。

+0

這足夠接近,給我一個什麼是錯的基本想法。在我的客戶端中,當向服務器發送請求時,我使用Task運行異步操作,並解決了我的問題。我根本不需要實現SynchronizationContext。謝謝! – Chogart