其实六七年前WCF盛行的时候也讨论过这个问题。
Close( ) 使 ClientBase<TChannel> 对象从其当前状态转换到关闭状态。
Abort( ) 使 ClientBase<TChannel> 对象立即从其当前状态转换到关闭状态。
文档描述仅仅能看出“立即”两个字的差别,但究竟该怎么用就有点迷茫了。
通过反编译可以发现,两个方法源自接口 ICommunicationObject,该接口“为系统中所有面向通信的对象(包括通道、通道管理器、工厂、侦听器以及调度程序和服务主机)定义基本状态机的协定。”
观察源码可知 Abort( ) 方法不会抛出异常, 而 Close( )方法则可能抛出 TimeoutException 和 CommunicationException。
另外,ClientBase<TChannel> 实现了接口 IDisposable接口,这意味着我们可以在代码中使用 using 语句块,这样在出作用域时会自动调用 Dispose( ) 方法来释放资源。不过Dispose( )方法内部也仅仅是调用了 Close( )方法,因此也是存在抛异常的可能。
究竟该怎么用??
这里直接给出最佳实践,感兴趣的同学可以反编译查看源码。
1 try 2 { 3 ... 4 client.Close(); 5 } 6 catch (CommunicationException e) 7 { 8 ... 9 client.Abort(); 10 } 11 catch (TimeoutException e) 12 { 13 ... 14 client.Abort(); 15 } 16 catch (Exception e) 17 { 18 ... 19 client.Abort(); 20 throw; 21 }
引用:MSDN