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

C# ThreadPool類簡介

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

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

在多線程的程序中,經常會出現兩種情況:

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

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

C# ThreadPool類提供一個由系統維護的線程池(可以看作一個線程的容器),該容器需要 Windows 2000 以上系統支持,因為其中某些方法調用了只有高版本的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類是一個靜態類,你不能也不必要生成它的對象。而且一旦使用該方法在線程池中添加了一個項目,那么該項目將是無法取消的。

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

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

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

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

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對象并且初始化為無信號狀態  
  66. ManualResetEvent eventX = new ManualResetEvent(false);  
  67. Console.WriteLine("Queuing {0} items to Thread Pool", MaxCount);  
  68. Alpha oAlpha = new Alpha(MaxCount);   
  69. //創建工作項  
  70. //注意初始化oAlpha對象的eventX屬性  
  71. oAlpha.eventX = eventX;  
  72. Console.WriteLine("Queue to Thread Pool 0");  
  73. try  
  74. {  
  75. //將工作項裝入線程池   
  76. //這里要用到Windows 2000以上版本才有的API,所以可能出現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)//如果當前系統支持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-25 17:49:07

C#入門

2009-08-20 14:28:00

C#靜態構造函數

2009-08-12 13:35:22

C#關系運算符

2009-08-25 17:52:01

C#可空值類型

2009-09-02 17:19:43

C#換行連接符

2009-08-12 14:29:32

C#條件運算符

2009-08-26 17:28:48

C# DateTime

2009-08-21 17:07:53

C# Convert.

2009-08-17 17:36:08

C# 枚舉

2024-12-23 09:09:54

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 | 亚洲综合一区二区三区 | 成人性视频免费网站 | 日韩国产中文字幕 | 亚洲欧美一区二区三区国产精品 | 欧美一级免费看 | 成人免费激情视频 | 久久一区精品 | 北条麻妃99精品青青久久主播 | 久色视频在线观看 | 午夜精品久久久久久久星辰影院 | 日日干夜夜操 | 日韩免费网 | 国产欧美视频一区二区 | www.亚洲免费| 精品一区二区久久久久久久网精 | 亚洲精品国产精品国自产在线 | 天天操网 | 亚洲一区二区免费电影 | 国产一区二区三区在线免费 | 中文字幕一区二区在线观看 | 日韩欧美视频在线 | 亚洲一区二区三区免费视频 | 精品一区二区三区免费毛片 | 中文字幕一区二区三区在线观看 | 日本精品一区二区三区在线观看视频 | 日韩黄a | cao在线 | 午夜视频在线免费观看 | 蜜桃视频在线观看免费视频网站www | 精品久久久久久久人人人人传媒 | 欧美日韩在线一区二区三区 | 视频1区 | 国产乱肥老妇国产一区二 | 亚洲一区在线观看视频 | 九九综合| 国产美女在线观看 |