C#中Finally的一个不太常见的用法
2014-04-14 16:22
357 查看
最近在看.net BCL 传送门 的源码. 在
有意思吗?代码中使用了一个空的Try代码块.然后把代码全都写在了Finally块.这么做的目地何在呢?
这其实是一个小的技巧:放在Finally中的代码可以防止执行线程在执行过程中被另一个线程用调用了Thread.Abort()或Thread. Interrupt()打断.从而保证这段代码执行的完整性.
举个例子: 如果不将上面代码放到Finally中运行.假如正好有一个线程A执行到
而放到Finally中的代码,即使线程B在线程A执行时调用了Thread.Abort()或Thread. Interrupt()方法时也能保证Finally块中的代码被完整的执行.
事实上,这个特性是在.net framework2.0中引入的.在.net 1.1时Finally没有这个作用.另外 Tread.Abort有可能打断线程内的静态构构函数执行.
另外我认为同样的功能也可以用这个
System.Collections.Concurrent.ConcurrentQueue
中看到一段有意思的代码.注意这段代码是写在ConcurrentQueue这个用于并发中的队列. 注意,这是一个无锁队列的实现.try { } finally { newhigh = Interlocked.Increment(ref m_high); if (newhigh <= SEGMENT_SIZE - 1) { m_array[newhigh] = value; m_state[newhigh].m_value = true; } if (newhigh == SEGMENT_SIZE - 1) { Grow(); } }
有意思吗?代码中使用了一个空的Try代码块.然后把代码全都写在了Finally块.这么做的目地何在呢?
这其实是一个小的技巧:放在Finally中的代码可以防止执行线程在执行过程中被另一个线程用调用了Thread.Abort()或Thread. Interrupt()打断.从而保证这段代码执行的完整性.
举个例子: 如果不将上面代码放到Finally中运行.假如正好有一个线程A执行到
m_array[newhigh] = value;而另外一个线程B调用了线程A的
Thread.Abort()那么
m_array[newhigh] = value;以后的代码可能没有机会得到执行.那么将引起ConcurrentQueue的不完整.
而放到Finally中的代码,即使线程B在线程A执行时调用了Thread.Abort()或Thread. Interrupt()方法时也能保证Finally块中的代码被完整的执行.
事实上,这个特性是在.net framework2.0中引入的.在.net 1.1时Finally没有这个作用.另外 Tread.Abort有可能打断线程内的静态构构函数执行.
另外我认为同样的功能也可以用这个
Thread.BeginCriticalRegion和
Thread.EndCriticalRegion();来实现.
相关文章推荐
- 【转】 C#中Finally的一个不太常见的用法
- C#中Finally的一个不太常见的用法
- C#中Finally的一个不太常见的用法
- 发现C#中的string.format的一个新用法
- C# 一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
- Android面试中的一个常见问题:Layout_weight的用法
- C# 一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
- C# 一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- C# 一个字符串是否在另外一个字符串数组里 Array.Exists 的用法 Array.IndexOf 用法
- C# 中 finally 的用法
- C#的OpenFileDialog和SaveFileDialog的常见用法
- C#基础系列——多线程的常见用法详解
- .NET/C#中 System.Text.Encoding 类的一个简单用法
- 关于C#中this的一个用法----用于C#原始类型扩展方法
- C#使用webbrowser的常见用法实例
- Sring中对于产生一个JAVA对象有几种常见的用法
- 关于C#中Console的常见用法
- Android studio 中 try catch 与 finally的比较常见的用法
- C#中try catch finally 用法