細(xì)說多線程(八) —— 計(jì)時(shí)器與鎖 |
發(fā)布時(shí)間: 2012/9/16 6:40:51 |
目錄 三、以ThreadStart方式實(shí)現(xiàn)多線程 八、定時(shí)器與鎖 8.1定時(shí)器 若要長期定時(shí)進(jìn)行一些工作,比如像郵箱更新,實(shí)時(shí)收聽信息等等,可以利用定時(shí)器Timer進(jìn)行操作。 開發(fā)實(shí)例 class Program { static void Main(string[] args) { ThreadPool.SetMaxThreads(1000, 1000); TimerCallback callback = new TimerCallback(ThreadPoolMessage); Timer t = new Timer(callback,"Hello Jack! ", 0, 1000); Console.ReadKey(); } //顯示線程池現(xiàn)狀 注意觀察運(yùn)行結(jié)果,每次調(diào)用Timer綁定的方法時(shí)不一定是使用同一線程,但線程都會是來自工作者線程的后臺線程。
在使用多線程開發(fā)時(shí),存在一定的共用數(shù)據(jù),為了避免多線程同時(shí)操作同一數(shù)據(jù),.NET提供了lock、Monitor、Interlocked等多個(gè)鎖定數(shù)據(jù)的方式。 8.2.1 lock lock的使用比較簡單,如果需要鎖定某個(gè)對象時(shí),可以直接使用lock(this)的方式。 1 private void Method() 2 { 3 lock(this) 4 { 5 //在此進(jìn)行的操作能保證在同一時(shí)間內(nèi)只有一個(gè)線程對此對象操作 如果操作只鎖定某段代碼,可以事先建立一個(gè)object對象,并對此對象進(jìn)行操作鎖定,這也是.net提倡的鎖定用法。 class Control { private object obj=new object(); public void Method() { lock(obj) {.......} } }
8.2.2 Montior Montior存在于System.Thread命名空間內(nèi),相比lock,Montior使用更靈活。 1 class Control 2 { 3 private object obj=new object(); 4 5 public void Method() 6 { 7 Monitor.Enter(obj); 8 try 9 {......} 10 catch(Excetion ex) 11 {......} 12 finally 13 { 14 Monitor.Exit(obj); 15 } 16 } 17 } 18 使用try的方式,能確保程序不會因死鎖而釋放出異常!
8.2.3 Interlocked Interlocked存在于System.Thread命名空間內(nèi),它的操作比Monitor使用更簡單。 Increment、Decrement 可以使參數(shù)安全地加1或減1并返回遞增后的新值。 class Example { private int a=1; public void AddOne() { int newA=Interlocked.Increment(ref a); } } Exchange可以安全地變量賦值。 1 public void SetData() 2 { 3 Interlocked.Exchange(ref a,100); 4 } CompareExchange使用特別方便,它相當(dāng)于if的用法,當(dāng)a等于1時(shí),則把100賦值給a。 public void CompareAndExchange() { Interlocked.CompareExchange(ref a,100,1); }
熟悉掌握多線程開發(fā),對提高系統(tǒng)工作效率非常有幫助,尤其是回調(diào)方法與最近火熱的并行編程更應(yīng)該引起各位的重視。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |