Проблема с WCF
От: __horn  
Дата: 25.07.12 12:02
Оценка:
Схема работа такова. К 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, то глюка не будет.
Измени свое мышление и ты изменишь свою жизнь!
wcf
Re: Проблема с WCF
От: __horn  
Дата: 25.07.12 15:05
Оценка:
[CallbackBehavior(UseSynchronizationContext = false)] рекомендованный в таких случаях не помогает.

Решает проблему установка IsOneWay = true у нужных методов. Но это не то, что мне нужно.
Измени свое мышление и ты изменишь свою жизнь!
wcf
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.