細說多線程(八) —— 計時器與鎖 |
發(fā)布時間: 2012/9/16 6:40:51 |
目錄 八、定時器與鎖 8.1定時器 若要長期定時進行一些工作,比如像郵箱更新,實時收聽信息等等,可以利用定時器Timer進行操作。 開發(fā)實例 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)狀 注意觀察運行結果,每次調用Timer綁定的方法時不一定是使用同一線程,但線程都會是來自工作者線程的后臺線程。
在使用多線程開發(fā)時,存在一定的共用數(shù)據(jù),為了避免多線程同時操作同一數(shù)據(jù),.NET提供了lock、Monitor、Interlocked等多個鎖定數(shù)據(jù)的方式。 8.2.1 lock lock的使用比較簡單,如果需要鎖定某個對象時,可以直接使用lock(this)的方式。 1 private void Method() 2 { 3 lock(this) 4 { 5 //在此進行的操作能保證在同一時間內只有一個線程對此對象操作 如果操作只鎖定某段代碼,可以事先建立一個object對象,并對此對象進行操作鎖定,這也是.net提倡的鎖定用法。 class Control { private object obj=new object(); public void Method() { lock(obj) {.......} } }
8.2.2 Montior Montior存在于System.Thread命名空間內,相比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命名空間內,它的操作比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使用特別方便,它相當于if的用法,當a等于1時,則把100賦值給a。 public void CompareAndExchange() { Interlocked.CompareExchange(ref a,100,1); }
熟悉掌握多線程開發(fā),對提高系統(tǒng)工作效率非常有幫助,尤其是回調方法與最近火熱的并行編程更應該引起各位的重視。 本文出自:億恩科技【www.allwellnessguide.com】 |