自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#中Finally的一個不太常見的用法

開發(fā) 后端
這其實是一個小的技巧:放在Finally中的代碼可以防止執(zhí)行線程在執(zhí)行過程中被另一個線程用調用了Thread.Abort()或Thread. Interrupt()打斷.從而保證這段代碼執(zhí)行的完整性。

最近在看.net BCL 傳送門 的源碼. 在

System.Collections.Concurrent.ConcurrentQueue

中看到一段有意思的代碼.注意這段代碼是寫在ConcurrentQueue這個用于并發(fā)中的隊列. 注意,這是一個無鎖隊列的實現(xiàn).

  1. try 
  2.  { }  
  3.  finally 
  4.  {  
  5.      newhigh = Interlocked.Increment(ref m_high);  
  6.      if (newhigh <= SEGMENT_SIZE - 1)  
  7.      {  
  8.          m_array[newhigh] = value;  
  9.          m_state[newhigh].m_value = true;  
  10.      }  
  11.      if (newhigh == SEGMENT_SIZE - 1)  
  12.      {  
  13.          Grow();  
  14.      }  
  15.  } 
有意思嗎?代碼中使用了一個空的Try代碼塊.然后把代碼全都寫在了Finally塊.這么做的目地何在呢?

這其實是一個小的技巧:放在Finally中的代碼可以防止執(zhí)行線程在執(zhí)行過程中被另一個線程用調用了Thread.Abort()或Thread. Interrupt()打斷.從而保證這段代碼執(zhí)行的完整性。

舉個例子: 如果不將上面代碼放到Finally中運行.假如正好有一個線程A執(zhí)行到 m_array[newhigh] = value;而另外一個線程B調用了線程A的Thread.Abort() 那么m_array[newhigh] = value; 以后的代碼可能沒有機會得到執(zhí)行.那么將引起ConcurrentQueue的不完整。

而放到Finally中的代碼,即使線程B在線程A執(zhí)行時調用了Thread.Abort()或Thread. Interrupt()方法時也能保證Finally塊中的代碼被完整的執(zhí)行。

事實上,這個特性是在.net framework2.0中引入的.在.net 1.1時Finally沒有這個作用.另外 Tread.Abort有可能打斷線程內的靜態(tài)構構函數(shù)執(zhí)行。

另外我認為同樣的功能也可以用這個Thread.BeginCriticalRegion 和Thread.EndCriticalRegion(); 來實現(xiàn)。

原文鏈接:http://www.cnblogs.com/listhome/p/3664300.html

責任編輯:林師授 來源: 博客園
相關推薦

2009-07-30 18:18:27

C#時間計算

2009-08-18 17:19:33

C#事件模型

2009-07-22 17:15:04

C#實現(xiàn)

2011-07-06 10:47:52

C#using

2009-08-26 14:48:21

C#打印分頁

2011-04-25 14:42:10

C#lock

2009-08-25 01:46:00

C# WINDOWS服

2009-08-26 15:53:42

C#數(shù)據(jù)訪問XML

2009-08-27 15:22:27

C#中的GET與SET

2024-03-19 14:18:48

C#后端編程

2009-08-31 14:19:20

C#打開一個文件

2009-08-25 15:23:16

C#子線程

2009-09-01 16:03:32

C#單元測試

2009-08-31 13:53:03

C#創(chuàng)建一個文件

2009-08-19 14:15:42

C# 復合控件

2023-11-30 12:03:06

linuxAwk

2013-06-05 10:11:20

索引器C#

2009-08-21 09:30:05

is和as操作符

2013-02-25 10:18:08

ThreadMsgC#

2023-10-26 11:22:32

點贊
收藏

51CTO技術棧公眾號