Хотя это не строго направлено на канал, вы можете сделать:
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;
}
Ответ 2
Это был общепринятый способ освобождения клиентских прокси WCF в "ранние" дни WCF.
Однако с тех пор все изменилось. Оказалось, что реализация IClientChannel <T> .Dispose() просто вызывает IClientChannel < Tcl.(), который может вызывать исключение при некоторых обстоятельствах, например, когда базовый канал не открыт или не может быть закрыт в своевременная мода.
Поэтому не рекомендуется ссылаться на Close() в блоке catch, так как это может оставить некоторые нереализованные ресурсы в случае исключения.
Новый рекомендуемый способ - вызывать IClientChannel <T> .Abort() в блоке catch вместо этого, в случае Close() потерпит неудачу. Вот пример: