Правильный способ эффективного закрытия каналов WCF 4 - PullRequest
11 голосов
/ 30 января 2012

Я использую следующие способы закрытия каналов WCF 4.Это правильный способ сделать это?

using (IService channel 
    = CustomChannelFactory<IService>.CreateConfigurationChannel())
{
    channel.Open();

    //do stuff
}// channels disposes off??

Ответы [ 2 ]

20 голосов
/ 30 января 2012

То, что было общепринятым способом освобождения клиентских прокси WCF в «ранние» дни WCF.

Однако с тех пор все изменилось.Оказалось, что реализация IClientChannel .Dispose () просто вызывает метод IClientChannel .Close () , который может вызвать исключение при некоторых обстоятельствах, например, когда базовый канал не открыт или не может быть закрыт своевременно.

Поэтому не рекомендуется запускать Close() в блоке catch, посколькукоторые могут оставить некоторые неизданные ресурсы в случае исключения.

новый рекомендуемый способ - вызвать IClientChannel .Abort () в пределах catch блокировать вместо этого, на случай, если Close() потерпит неудачу.Вот пример:

try
{
    channel.DoSomething();
    channel.Close();
}
catch
{
    channel.Abort();
    throw;
}

Обновление:

Вот ссылка на статью MSDN, в которой описывает эту рекомендацию .

8 голосов
/ 30 января 2012

Хотя это не строго направлено на канал, вы можете сделать:

ChannelFactory<IMyService> channelFactory = null;
try
{
    channelFactory =
        new ChannelFactory<IMyService>();
    channelFactory.Open();

    // Do work...

    channelFactory.Close();
}
catch (CommunicationException)
{
    if (channelFactory != null)
    {
        channelFactory.Abort();
    }
}
catch (TimeoutException)
{
    if (channelFactory != null)
    {
        channelFactory.Abort();
    }
}
catch (Exception)
{
    if (channelFactory != null)
    {
        channelFactory.Abort();
    }
    throw;
}
...