none
Утечка памяти при работе с WCF RRS feed

  • Вопрос

  • Разрабатываю систему с WCF используя wsDualHttpBinding

    на клиенте есть код для подключения к серверу и регистрации компьютера.

                while (!_isClosed)
                {
                    try
                    {
                        IsOpenConnect = false;
    
                        Proxy = null;
                        Proxy = new ExamServiceClient(_site);
    
                        Proxy.Subscribe(_computerNumber);
    
                        IsOpenConnect = true;
    
                        break;
    
                    }
                    catch (Exception)
                    {
                        IsOpenConnect = false;
                    }
                }

    если сервер был загружен, то клиент его находит, вызывается функция Subscribe и все работает хорошо. Однако если сервер не был загружен, то цикл на клиенте продолжается бесконечно и при этом наблюдается утечка памяти (причем достаточно быстро). Вопрос: как правильно освободить объект прокси класса WCF (Proxy) при State = Faulted чтобы не было утечки?

    • Перемещено YatajgaEditor 30 марта 2014 г. 10:55
    30 марта 2014 г. 9:37

Все ответы

  • Такой вопрос: наследует ли ваш клиентский прокси-класс интерфейс IDisposable? Если он наследник стандартного ClientBase<TChannel>, то да. Тогда он содержит неправляемые ресурсы (соединения) которые надо диспозить. А поскольку у вас бесконечный цикл, то не удивительно, что происходит утечка ресурсов. И в целом, подобная реализация открытия соединения в цикле очень плохой вариант кода. Реализуйте хотя бы попытку открытия соединения с некоторой переодичностью. Ну а лучшим решением является реализация паттерна – "Прерыватель цепи" (Circuit Breaker). Очень хорошо об этом написано в книге Марка Симана (Внедрение зависимостей в .NET).

    Сделаем содержимое сообщества лучше, вместе!

    30 марта 2014 г. 10:54
    Модератор
  • Мой прокси класс был создан стандартным способом через VisualStudio. В принципе ((IDisposable)Proxy).Dispose() я вызвать могу, но только если Proxy.State != Faulted, иначе генерится исключение что нельзя делать операции когда канал в состоянии Faulted.

    Я не совсем понял насчет паттерна "Прерывателя цепи"...
    Как правильнее реализовать постоянным поиск сервера? Например, у меня есть идея через создание таймера.
    30 марта 2014 г. 18:02