关于WCF客户端对象的释放:Close( ) & Abort( )

其实六七年前WCF盛行的时候也讨论过这个问题。

 

Close( ) 使 ClientBase<TChannel> 对象从其当前状态转换到关闭状态。

Abort( ) 使 ClientBase<TChannel> 对象立即从其当前状态转换到关闭状态。

文档描述仅仅能看出“立即”两个字的差别,但究竟该怎么用就有点迷茫了。

 

通过反编译可以发现,两个方法源自接口 ICommunicationObject,该接口“为系统中所有面向通信的对象(包括通道、通道管理器、工厂、侦听器以及调度程序和服务主机)定义基本状态机的协定。”

观察源码可知 Abort( ) 方法不会抛出异常, 而 Close( )方法则可能抛出 TimeoutExceptionCommunicationException

 

另外,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

 

posted @ 2020-05-25 22:10  X-Cracker  阅读(528)  评论(0编辑  收藏  举报