Это то, что я понимаю из того, почему нам нужно реализовать наш собственный класс-оболочку для serviceClients (пожалуйста, исправьте меня, если я ошибаюсь):
Цель ловли исключения
в методе Dispose () заключается в том, что
.Close () может выдать
"CommunicationException" или
«TimeoutException» - и для предотвращения
связь повесить вы ловите те
два исключения для использования .Abort (), который
изменит состояние
объект связи закрыт
immediatley. - это не сделало бы
смысл позволять исключению быть
необработанный, потому что необязательные вызовы
чтобы методы уже были сделаны
так как мы находимся в части Dispose (), и
поэтому было бы странно бросить
исключение, когда работа на самом деле
сделано как надо.
Но почему:
public class ServiceClientWrapper<TServiceType> : IDisposable
{
public TServiceType Channel { get; private set; }
private readonly ChannelFactory<TServiceType> _channelFactory;
public ServiceClientWrapper(string endpoint)
{
_channelFactory = new ChannelFactory<TServiceType>(endpoint);
Channel = _channelFactory.CreateChannel();
((IChannel)Channel).Open();
}
#region Implementation of IDisposable
public void Dispose()
{
try
{
((IChannel)Channel).Close();
}
catch (CommunicationException ex)
{
((IChannel)Channel).Abort();
}
catch (TimeoutException ex)
{
((IChannel)Channel).Abort();
}
catch (Exception)
{
((IChannel)Channel).Abort();
throw;
}
}
#endregion
}
Когда вы можете сделать:
public class ServiceClientWrapper<TServiceType> : IDisposable
{
public TServiceType Channel { get; private set; }
private readonly ChannelFactory<TServiceType> _channelFactory;
public ServiceClientWrapper(string endpoint)
{
_channelFactory = new ChannelFactory<TServiceType>(endpoint);
Channel = _channelFactory.CreateChannel();
((IChannel)Channel).Open();
}
#region Implementation of IDisposable
public void Dispose()
{
((IChannel)Channel).Abort();
}
#endregion
}
Согласно MSDN, .Close()
и .Abort()
изменят состояние объекта связи на «Закрыто»?