2016-01-22 4 views
0

В настоящее время я работаю над приложением для обмена мгновенными сообщениями. Как только клиент подключается к серверу и отправляет сообщение, он работает нормально. Второй клиент подключается, оба клиента общаются и все работает отлично. Проблема возникает, когда 2 клиента отправляют сообщение одновременно. Затем оба клиента замораживаются (при отладке я получаю тайм-аут), но msg отображается хорошо для других клиентов в чате.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 Я уже пробовал, но мне нужно использовать singleton. Если я использую PerCall или PerSession, в зависимости от того, какой из двух, то мое приложение становится испорченным. Случается, что 2 клиента (или любые другие клиенты) НЕ смогут общаться, потому что для каждого из них создается новый объект. Они могут отправлять сообщения, хотя ни один из них не будет виден другому. Я не уверен, что мои объяснения достаточно хороши для понимания поведения приложения, поэтому, пожалуйста, дайте мне знать, если это не так. – Chogart

+0

Перебирать все. Это всего лишь пользовательский интерфейс 2-х клиентов, замораживающих. И это все. Я думаю, что проблема заключается в синхронизации. – 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

Смежные вопросы