Схема работа такова. К WCF-сервису подключены несколько клиентов. Сам сервис является синглетом. В сервисе реализована обработка двух очередей для входящих и исходящих сообщений. Кроме того есть методы типа "запрос-ответ", которые вызываются даже когда очередь заполнена (назовем эти методы условно "высокоприоритетными" их можно вызвать в любой момент).
Поскольку основная работа идет с очередью, то не будет ли проблем, если параллельно вызвать "высокоприоритетный метод" ?
Канал между клиентом и сервисом дуплексный, используется netTcpBinding.
Основная проблема в зависании callback-функции при ее вызове из "высокоприоритетных" методов.
public void SomeMethod(int ID)
{
this.stopEvent.Reset(); // останавливаем отправляющую очередь (на всякий случай)
// некоторая логика
...
((user) someUser).callback.SomeMethodCallback(); /* эта функция здесь зависает, хотя на клиенте отрабатывает нормально */
this.stopEvent.Set(); // возобновляем отправку сообщений в очереди
}
Вот в чем основная проблема: когда очередь получает и обрабатывает сообщения, то callback-функция начинает зависать.
Кусочек логики очереди:
public void PopQueueProcessing() // обработка очереди для отправки сообщений
{
int count;
while (!exit)
{
popRequestEvent.WaitOne();
lock (this)
{
count = popQueue.Count;
}
while (count > 0)
{
var copyUsers = new user[this.users.Count];
this.users.Values.CopyTo(copyUsers, 0);
MessagePack somePack;
lock (this)
{
somePack = popQueue.Dequeue();
}
if (!somePack.IsForAll)
{
int? ID = somePack.ID;
foreach (var someUser in copyUsers)
{
if (((user)someUser).ID == ID)
{
stopEvent.WaitOne();
((user)someUser).callback.SendMessageToClient(somePack.message, ((user)someUser).ID); /*если закоммонтировать эту строчку, то тогда callback-функция, определенная выше НЕ ЗАВИСАЕТ*/
break;
}
}
}
else
{
...
((user)someUser).callback.SendMessageToClient(somePack.message, null);
...
}
...
}
}
...
}
Кстати, если пометить в контракте
SomeMethodCallback как IsOneWay = true, то глюка не будет.