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

C# ThreadPool類簡介

開發(fā) 后端
這里介紹C# ThreadPool類提供一個由系統(tǒng)維護(hù)的線程池(可以看作一個線程的容器),該容器需要 Windows 2000 以上系統(tǒng)支持,因為其中某些方法調(diào)用了只有高版本的Windows才有的API函數(shù)。

C#語言有很多值得學(xué)習(xí)的地方,這里我們主要介紹C# ThreadPool類,包括介紹ThreadPool.QueueUserWorkItem()方法等方面。

在多線程的程序中,經(jīng)常會出現(xiàn)兩種情況:

一種情況: 應(yīng)用程序中,線程把大部分的時間花費在等待狀態(tài),等待某個事件發(fā)生,然后才能給予響應(yīng),這一般使用ThreadPool(線程池)來解決;

另一種情況:線程平時都處于休眠狀態(tài),只是周期性地被喚醒,這一般使用Timer(定時器)來解決;

C# ThreadPool類提供一個由系統(tǒng)維護(hù)的線程池(可以看作一個線程的容器),該容器需要 Windows 2000 以上系統(tǒng)支持,因為其中某些方法調(diào)用了只有高版本的Windows才有的API函數(shù)。

將線程安放在線程池里,需使用ThreadPool.QueueUserWorkItem()方法,該方法的原型如下:

  1. //將一個線程放進(jìn)線程池,該線程的Start()方法將調(diào)用WaitCallback代理對象代表的函數(shù)  
  2. public static bool QueueUserWorkItem(WaitCallback);  
  3. //重載的方法如下,參數(shù)object將傳遞給WaitCallback所代表的方法  
  4. public static bool QueueUserWorkItem(WaitCallback, object); 

C# ThreadPool類是一個靜態(tài)類,你不能也不必要生成它的對象。而且一旦使用該方法在線程池中添加了一個項目,那么該項目將是無法取消的。

在這里你無需自己建立線程,只需把你要做的工作寫成函數(shù),然后作為參數(shù)傳遞給ThreadPool.QueueUserWorkItem()方法就行了,傳遞的方法就是依靠WaitCallback代理對象,而線程的建立、管理、運行等工作都是由系統(tǒng)自動完成的,你無須考慮那些復(fù)雜的細(xì)節(jié)問題。
ThreadPool 的用法:首先程序創(chuàng)建了一個ManualResetEvent對象,該對象就像一個信號燈,可以利用它的信號來通知其它線程。

本例中,當(dāng)線程池中所有線程工作都完成以后,ManualResetEvent對象將被設(shè)置為有信號,從而通知主線程繼續(xù)運行。ManualResetEvent對象有幾個重要的方法:初始化該對象時,用戶可以指定其默認(rèn)的狀態(tài)(有信號/無信號);

在初始化以后,該對象將保持原來的狀態(tài)不變,直到它的Reset()或者Set()方法被調(diào)用:
◆Reset()方法:將其設(shè)置為無信號狀態(tài);
◆Set()方法:將其設(shè)置為有信號狀態(tài)。

WaitOne()方法:使當(dāng)前線程掛起,直到ManualResetEvent對象處于有信號狀態(tài),此時該線程將被激活。然后,程序?qū)⑾蚓€程池中添加工作項,這些以函數(shù)形式提供的工作項被系統(tǒng)用來初始化自動建立的線程。當(dāng)所有的線程都運行完了以后,ManualResetEvent.Set()方法被調(diào)用,因為調(diào)用了ManualResetEvent.WaitOne()方法而處在等待狀態(tài)的主線程將接收到這個信號,于是它接著往下執(zhí)行,完成后邊的工作。

C# ThreadPool類的用法示例:

  1. using System;  
  2. using System.Collections;  
  3. using System.Threading;  
  4.  
  5. namespace ThreadExample  
  6. {  
  7. //這是用來保存信息的數(shù)據(jù)結(jié)構(gòu),將作為參數(shù)被傳遞  
  8. public class SomeState  
  9. {  
  10. public int Cookie;  
  11. public SomeState(int iCookie)  
  12. {  
  13. Cookie = iCookie;  
  14. }  
  15. }  
  16.  
  17. public class Alpha  
  18. {  
  19. public Hashtable HashCount;  
  20. public ManualResetEvent eventX;  
  21. public static int iCount = 0;  
  22. public static int iMaxCount = 0;  
  23.  
  24. public Alpha(int MaxCount)   
  25. {  
  26. HashCount = new Hashtable(MaxCount);  
  27. iMaxCount = MaxCount;  
  28. }  
  29.  
  30. //線程池里的線程將調(diào)用Beta()方法  
  31. public void Beta(Object state)  
  32. {  
  33. //輸出當(dāng)前線程的hash編碼值和Cookie的值  
  34. Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(),
    ((SomeState)state).Cookie);  
  35. Console.WriteLine("HashCount.Count=={0}, Thread.CurrentThread.GetHashCode()=={1}", 
    HashCount.Count, Thread.CurrentThread.GetHashCode());  
  36. lock (HashCount)   
  37. {  
  38. //如果當(dāng)前的Hash表中沒有當(dāng)前線程的Hash值,則添加之  
  39. if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))  
  40. HashCount.Add (Thread.CurrentThread.GetHashCode(), 0);  
  41. HashCount[Thread.CurrentThread.GetHashCode()] =   
  42. ((int)HashCount[Thread.CurrentThread.GetHashCode()])+1;  
  43. }  
  44. int iX = 2000;  
  45. Thread.Sleep(iX);  
  46. //Interlocked.Increment()操作是一個原子操作,具體請看下面說明  
  47. Interlocked.Increment(ref iCount);  
  48.  
  49. if (iCount == iMaxCount)  
  50. {  
  51. Console.WriteLine();  
  52. Console.WriteLine("Setting eventX ");  
  53. eventX.Set();  
  54.  }  
  55. }  
  56. }  
  57.  
  58. public class SimplePool  
  59. {  
  60. public static int Main(string[] args)  
  61. {  
  62. Console.WriteLine("Thread Pool Sample:");  
  63. bool W2K = false;  
  64. int MaxCount = 10;//允許線程池中運行最多10個線程  
  65. //新建ManualResetEvent對象并且初始化為無信號狀態(tài)  
  66. ManualResetEvent eventX = new ManualResetEvent(false);  
  67. Console.WriteLine("Queuing {0} items to Thread Pool", MaxCount);  
  68. Alpha oAlpha = new Alpha(MaxCount);   
  69. //創(chuàng)建工作項  
  70. //注意初始化oAlpha對象的eventX屬性  
  71. oAlpha.eventX = eventX;  
  72. Console.WriteLine("Queue to Thread Pool 0");  
  73. try  
  74. {  
  75. //將工作項裝入線程池   
  76. //這里要用到Windows 2000以上版本才有的API,所以可能出現(xiàn)NotSupportException異常  
  77. ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0));  
  78. W2K = true;  
  79. }  
  80. catch (NotSupportedException)  
  81. {  
  82. Console.WriteLine("These API's may fail when called on a non-Windows 2000 system.");  
  83. W2K = false;  
  84. }  
  85. if (W2K)//如果當(dāng)前系統(tǒng)支持ThreadPool的方法.  
  86. {  
  87. for (int iItem=1;iItem < MaxCount;iItem++)  
  88. {  
  89. //插入隊列元素  
  90. Console.WriteLine("Queue to Thread Pool {0}", iItem);  
  91. ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(iItem));  
  92. }  
  93. Console.WriteLine("Waiting for Thread Pool to drain");  
  94. //等待事件的完成,即線程調(diào)用ManualResetEvent.Set()方法  
  95. eventX.WaitOne(Timeout.Infinite,true);  
  96. //WaitOne()方法使調(diào)用它的線程等待直到eventX.Set()方法被調(diào)用  
  97. Console.WriteLine("Thread Pool has been drained (Event fired)");  
  98. Console.WriteLine();  
  99. Console.WriteLine("Load across threads");  
  100. foreach(object o in oAlpha.HashCount.Keys)  
  101. Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]);  
  102. }  
  103. Console.ReadLine();  
  104. return 0;  
  105. }  
  106. }  
  107. }  

【編輯推薦】

  1. C# lock關(guān)鍵字?jǐn)⑹?/FONT>
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標(biāo)識符簡單分析
責(zé)任編輯:佚名 來源: CSDN論壇
相關(guān)推薦

2009-08-31 15:13:46

C# CWorker類

2009-09-07 13:33:36

C# Pop3Conn

2009-09-02 17:10:45

C#語言入門

2024-05-06 00:00:00

ThreadPool線程調(diào)度

2009-08-25 17:07:27

C#虛擬方法

2009-08-25 17:49:07

C#入門

2009-08-20 14:28:00

C#靜態(tài)構(gòu)造函數(shù)

2024-12-23 09:09:54

2009-08-26 17:28:48

C# DateTime

2009-09-02 17:19:43

C#換行連接符

2009-08-12 13:35:22

C#關(guān)系運算符

2009-08-12 14:29:32

C#條件運算符

2009-08-17 17:36:08

C# 枚舉

2009-08-25 17:52:01

C#可空值類型

2009-08-21 17:07:53

C# Convert.

2009-08-12 14:49:33

C#移位運算符

2009-08-12 09:41:28

C# Director

2009-08-21 17:24:06

C# SingleIn

2009-09-03 10:42:16

C# Employee

2009-09-03 15:57:11

C# SystemMe
點贊
收藏

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