偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#中Finally的一個(gè)不太常見的用法

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

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

System.Collections.Concurrent.ConcurrentQueue

中看到一段有意思的代碼.注意這段代碼是寫在ConcurrentQueue這個(gè)用于并發(fā)中的隊(duì)列. 注意,這是一個(gè)無鎖隊(duì)列的實(shí)現(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.  } 
有意思嗎?代碼中使用了一個(gè)空的Try代碼塊.然后把代碼全都寫在了Finally塊.這么做的目地何在呢?

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

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

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

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

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

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

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2009-07-30 18:18:27

C#時(shí)間計(jì)算

2009-07-22 17:15:04

C#實(shí)現(xiàn)

2009-08-18 17:19:33

C#事件模型

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-26 15:53:42

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

2009-08-25 01:46:00

C# WINDOWS服

2009-08-27 15:22:27

C#中的GET與SET

2024-03-19 14:18:48

C#后端編程

2009-08-31 14:19:20

C#打開一個(gè)文件

2009-08-25 15:23:16

C#子線程

2009-09-01 16:03:32

C#單元測試

2009-08-31 13:53:03

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

2009-08-19 14:15:42

C# 復(fù)合控件

2023-11-30 12:03:06

linuxAwk

2023-10-26 11:22:32

2013-06-05 10:11:20

索引器C#

2013-02-25 10:18:08

ThreadMsgC#

2009-09-01 16:14:06

C#窗口抖動(dòng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號