成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# ThreadPool類簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

C# ThreadPool類的用法示例:

  1. using System;  
  2. using System.Collections;  
  3. using System.Threading;  
  4.  
  5. namespace ThreadExample  
  6. {  
  7. //這是用來保存信息的數據結構,將作為參數被傳遞  
  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. //線程池里的線程將調用Beta()方法  
  31. public void Beta(Object state)  
  32. {  
  33. //輸出當前線程的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. //如果當前的Hash表中沒有當前線程的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)//如果當前系統(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. //等待事件的完成,即線程調用ManualResetEvent.Set()方法  
  95. eventX.WaitOne(Timeout.Infinite,true);  
  96. //WaitOne()方法使調用它的線程等待直到eventX.Set()方法被調用  
  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關鍵字敘述
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標識符簡單分析
責任編輯:佚名 來源: CSDN論壇
相關推薦

2009-08-31 15:13:46

C# CWorker類

2009-09-07 13:33:36

C# Pop3Conn

2009-09-02 17:10:45

C#語言入門

2009-08-25 17:07:27

C#虛擬方法

2024-05-06 00:00:00

ThreadPool線程調度

2009-08-20 14:28:00

C#靜態(tài)構造函數

2009-08-25 17:49:07

C#入門

2024-12-23 09:09:54

2009-08-12 13:35:22

C#關系運算符

2009-08-17 17:36:08

C# 枚舉

2009-08-25 17:52:01

C#可空值類型

2009-09-02 17:19:43

C#換行連接符

2009-08-12 14:29:32

C#條件運算符

2009-08-21 17:07:53

C# Convert.

2009-08-26 17:28:48

C# DateTime

2009-08-12 14:49:33

C#移位運算符

2009-09-03 10:42:16

C# Employee

2009-09-03 15:57:11

C# SystemMe

2009-08-12 09:41:28

C# Director

2009-08-21 17:24:06

C# SingleIn
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美日韩中文字幕一区二区三区 | 一区二区中文字幕 | 91免费小视频 | 国产精品爱久久久久久久 | 国产黄色在线观看 | 欧美日韩久久久 | 91.xxx.高清在线 | 欧美精品一区二区三区在线 | 成人精品一区二区三区中文字幕 | 亚洲精品视频在线观看视频 | 九久久| 成人影音 | 日韩精品一区二区三区中文在线 | 91在线精品视频 | 精品欧美一区二区精品久久 | 先锋资源网| 精品国产乱码一区二区三区 | 伊人一区 | 在线免费观看日本 | 国产视频中文字幕在线观看 | 久久精品91| 亚洲一一在线 | 日日欧美 | 爱高潮www亚洲精品 中文字幕免费视频 | 精品久久久久久久久久久久久久 | 久久久久久91 | 色婷婷综合久久久中文字幕 | 黄色在线免费观看 | 精品一区二区久久久久久久网站 | 欧美成人一级 | 99精品一区二区三区 | 久久久久久国产 | 一区二区在线不卡 | 一区精品在线观看 | 亚洲精品播放 | 国产男女视频 | 国产精品国产成人国产三级 | 亚洲国产成人精品久久 | 亚洲欧美日韩一区 | 成人一区二区三区视频 | 久久久久无码国产精品一区 |