最近在研究ConcurrentQueue的实现,发现里面有个私有类Segment,拿Reflector看了下,其中有如下的代码:
1 internal List ToList(int start, int end)
2 {
3 List list = new List();
4 for (int i = start; i
9 回答
弑天下
TA贡献1818条经验 获得超8个赞
第一个是反编译问题,正如上面的人所说。第二个问题详解看这里。简单来说就是因为这里是多线程环境,因此任何时候都有可能会引发ThreadAbortException,如果是在try块里那么某些代码不能保证被执行。而finally块则可以保证即使是发生了ThreadAbortException,这些代码也会被执行。这是一个小技巧,不过现在已经不适用了,更好的替代方式是Thread.BeginCritialRegeion。
慕娘9325324
TA贡献1783条经验 获得超4个赞
你的反编译有问题吧:
// System.Collections.Concurrent.ConcurrentQueue.Segment
internal List ToList(int start, int end)
{
List list = new List();
for (int i = start; i <= end; i++)
{
SpinWait spinWait = default(SpinWait);
while (this.m_state[i] == 0)
{
spinWait.SpinOnce();
}
list.Add(this.m_array[i]);
}
return list;
}
try{}finally{} 有个很大的作用,就是保证 finally 块中的代码总是被执行,虽然这里 try 块里面没有任何代码,但是这种写法可以保证 Unhandled Exception 触发时,finally 块中的代码仍然会被执行。
不负相思意
TA贡献1777条经验 获得超10个赞
try里面没有任何代码的话,有什么可能性会触发Exception,反而是在finally里面放了那么多代码,要是引发Exception的话程序不就崩掉了?
临摹微笑
TA贡献1982条经验 获得超2个赞
@garry: MSDN对 finally 还有个解释,这里的直接原因不是多线程的问题,而是发生了 Unhandled Exception (这可能是 OS 异常)后,如何处理 finally 中代码块的问题,根据 OS 的设置,finally 中代码可能不会被执行。在 OS 看来,出现错误后会设置一个中断,CLR 根据中断的类型和位置做对应的处理,又或者无法处理直接卸载整个进程。
- 9 回答
- 0 关注
- 500 浏览
添加回答
举报
0/150
提交
取消