这就是我理解为什么我们需要为serviceClients实现自己的包装类(如果我错了请纠正我):
捕获异常的目的 在Dispose()方法中就是这样 .Close()可以抛出一个 “CommunicationException”或 “TimeoutException” - 并防止 连接挂你抓住那些 两个例外使用.Abort()当中 将改变的状态 通信对象关闭 immediatley。 - 它不会做任何 让异常成为一种感觉 未处理,因为nessecary调用 已经制定了方法 因为我们在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()
都会将通讯对象的状态更改为“已关闭”?
答案 0 :(得分:3)
关键是Close()的目标是优雅地关闭整个通信通道,包括通信协议所需的任何结束握手,而Abort()是客户端通道堆栈的粗鲁和残酷的拆分,没有试图将关闭正确地传达给另一方。因此,中止可能会使服务器端资源仍然依赖于不会进一步使用的连接。
所以我们总是希望尽可能执行Close,但是我们需要处理事情如此破碎以至于尝试执行Close会导致进一步异常的情况。
答案 1 :(得分:2)
关闭方法:
http://msdn.microsoft.com/en-us/library/ms405496.aspx
此方法使CommunicationObject从除Closed状态以外的任何状态正常转换为Closed状态。 Close方法允许在返回之前完成任何未完成的工作。例如,完成发送任何缓冲的消息。
中止方法 不一样或不符合规格中的规定。它不会完成任何仍在继续...