亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#多線程學習之(四)使用線程池進行多線程的自動管理

2020-01-24 02:01:42
字體:
來源:轉載
供稿:網友

本文實例講述了C#多線程學習之使用線程池進行多線程的自動管理。分享給大家供大家參考。具體如下:

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

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

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

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

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

將一個線程放進線程池,該線程的Start()方法將調用WaitCallback代理對象代表的函數

public static bool QueueUserWorkItem(WaitCallback);

 

重載的方法如下,參數object將傳遞給WaitCallback所代表的方法

public static bool QueueUserWorkItem(WaitCallback, object);

注意:

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

在這里你無需自己建立線程,只需把你要做的工作寫成函數,然后作為參數傳遞給ThreadPool.QueueUserWorkItem()方法就 行了,傳遞的方法就是依靠WaitCallback代理對象,而線程的建立、管理、運行等工作都是由系統自動完成的,你無須考慮那些復雜的細節問題。

ThreadPool 的用法:

首先程序創建了一個ManualResetEvent對象,該對象就像一個信號燈,可以利用它的信號來通知其它線程。
本例中,當線程池中所有線程工作都完成以后,ManualResetEvent對象將被設置為有信號,從而通知主線程繼續運行。

ManualResetEvent對象有幾個重要的方法:

初始化該對象時,用戶可以指定其默認的狀態(有信號/無信號);
在初始化以后,該對象將保持原來的狀態不變,直到它的Reset()或者Set()方法被調用:

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

ThreadPool 的用法示例:

using System;using System.Collections;using System.Threading;namespace ThreadExample{ //這是用來保存信息的數據結構,將作為參數被傳遞 public class SomeState { public int Cookie; public SomeState(int iCookie) {  Cookie = iCookie; } } public class Alpha {public Hashtable HashCount;public ManualResetEvent eventX;public static int iCount = 0;public static int iMaxCount = 0;  public Alpha(int MaxCount) {  HashCount = new Hashtable(MaxCount);  iMaxCount = MaxCount;}//線程池里的線程將調用Beta()方法public void Beta(Object state){ //輸出當前線程的hash編碼值和Cookie的值  Console.WriteLine(" {0} {1} :", Thread.CurrentThread.GetHashCode(),((SomeState)state).Cookie);  Console.WriteLine("HashCount.Count=={0}, Thread.CurrentThread.GetHashCode()=={1}", HashCount.Count, Thread.CurrentThread.GetHashCode());  lock (HashCount)   { //如果當前的Hash表中沒有當前線程的Hash值,則添加之 if (!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))   HashCount.Add (Thread.CurrentThread.GetHashCode(), 0);  HashCount[Thread.CurrentThread.GetHashCode()] =    ((int)HashCount[Thread.CurrentThread.GetHashCode()])+1; }   int iX = 2000;   Thread.Sleep(iX);   //Interlocked.Increment()操作是一個原子操作,具體請看下面說明   Interlocked.Increment(ref iCount);   if (iCount == iMaxCount)   {  Console.WriteLine(); Console.WriteLine("Setting eventX "); eventX.Set();  } } }  public class SimplePool  {   public static int Main(string[] args)   {    Console.WriteLine("Thread Pool Sample:");    bool W2K = false;    int MaxCount = 10;//允許線程池中運行最多10個線程    //新建ManualResetEvent對象并且初始化為無信號狀態    ManualResetEvent eventX = new ManualResetEvent(false);    Console.WriteLine("Queuing {0} items to Thread Pool", MaxCount);    Alpha oAlpha = new Alpha(MaxCount);     //創建工作項    //注意初始化oAlpha對象的eventX屬性    oAlpha.eventX = eventX;    Console.WriteLine("Queue to Thread Pool 0");    try    {     //將工作項裝入線程池      //這里要用到Windows 2000以上版本才有的API,所以可能出現NotSupportException異常     ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(0));     W2K = true;    }    catch (NotSupportedException)    {     Console.WriteLine("These API's may fail when called on a non-Windows 2000 system.");     W2K = false;    }    if (W2K)//如果當前系統支持ThreadPool的方法.    {     for (int iItem=1;iItem < MaxCount;iItem++)     {      //插入隊列元素      Console.WriteLine("Queue to Thread Pool {0}", iItem);      ThreadPool.QueueUserWorkItem(new WaitCallback(oAlpha.Beta), new SomeState(iItem));     }     Console.WriteLine("Waiting for Thread Pool to drain");     //等待事件的完成,即線程調用ManualResetEvent.Set()方法     eventX.WaitOne(Timeout.Infinite,true);     //WaitOne()方法使調用它的線程等待直到eventX.Set()方法被調用     Console.WriteLine("Thread Pool has been drained (Event fired)");     Console.WriteLine();     Console.WriteLine("Load across threads");     foreach(object o in oAlpha.HashCount.Keys)      Console.WriteLine("{0} {1}", o, oAlpha.HashCount[o]);    }    Console.ReadLine();    return 0;   }  } }}

程序中應該引起注意的地方:
SomeState類是一個保存信息的數據結構,它在程序中作為參數被傳遞給每一個線程,因為你需要把一些有用的信息封裝起來提供給線程,而這種方式是非常有效的。
程序出現的InterLocked類也是專為多線程程序而存在的,它提供了一些有用的原子操作。

原子操作:就是在多線程程序中,如果這個線程調用這個操作修改一個變量,那么其他線程就不能修改這個變量了,這跟lock關鍵字在本質上是一樣的。

我們應該徹底地分析上面的程序,把握住線程池的本質,理解它存在的意義是什么,這樣才能得心應手地使用它。

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久影视精品| 欧美性色xo影院| 亚洲国产精品久久久久秋霞不卡| 欧洲午夜精品久久久| 日韩av在线免费观看一区| 在线观看国产精品91| 91亚洲精品一区二区| 久久久国产影院| 成人乱色短篇合集| 国产精品入口夜色视频大尺度| 日韩大片免费观看视频播放| 亚洲欧美日韩在线一区| 亚洲一区二区三区视频播放| 亚洲视频电影图片偷拍一区| 国产亚洲精品一区二区| 91久久久久久国产精品| 日韩欧美亚洲一二三区| 97免费视频在线| 久久久免费精品视频| 亚洲欧美色婷婷| 国产一区二区黑人欧美xxxx| 最近2019年中文视频免费在线观看| 成人性生交大片免费看小说| 岛国av一区二区| 亚洲乱码av中文一区二区| 亚洲精品suv精品一区二区| 国产精品最新在线观看| 国产精品96久久久久久| 久久久久久久久久久91| 少妇av一区二区三区| 国内揄拍国内精品| 亚洲欧美在线x视频| 国产精品中文字幕在线| 国产mv免费观看入口亚洲| 久久久久久久久久国产精品| 亚洲第一福利视频| 国产97色在线|日韩| 日韩在线不卡视频| 国产日韩欧美综合| 久久久天堂国产精品女人| 亚洲毛片一区二区| 亚洲精品视频在线观看视频| 国产成人短视频| 欧美激情视频免费观看| 51色欧美片视频在线观看| 亚洲美腿欧美激情另类| 久久久久国产视频| 日韩av电影中文字幕| 国产精品jizz在线观看麻豆| 久久九九热免费视频| 97激碰免费视频| 国产成人亚洲综合91| 国产色综合天天综合网| 亚洲精品视频播放| 久久久久在线观看| 国产精品丝袜白浆摸在线| 精品国模在线视频| 久久精品国产2020观看福利| 亚洲福利视频网| 国产精品精品国产| 亚洲精品天天看| 中国人与牲禽动交精品| 精品国产999| 亚洲白拍色综合图区| 成人久久久久久| 高清欧美性猛交xxxx黑人猛交| 日韩在线观看免费高清| 2019国产精品自在线拍国产不卡| 亚洲精品自拍第一页| 国产精品视频导航| 国产精品视频免费在线观看| 欧美人成在线视频| 亚洲欧洲日韩国产| 亚洲国产成人精品电影| 欧美在线国产精品| 精品一区二区亚洲| 久久久久久69| 国产精品午夜一区二区欲梦| 91爱视频在线| 亚洲成人av中文字幕| 亚洲一区二区免费| 丝袜情趣国产精品| 国语自产精品视频在线看一大j8| 在线日韩精品视频| 亚洲欧美日韩爽爽影院| 日韩暖暖在线视频| 91影院在线免费观看视频| 日韩h在线观看| 久久精品国产精品亚洲| 中文字幕视频一区二区在线有码| 久热精品视频在线免费观看| 国产视频观看一区| 成人免费淫片aa视频免费| 777午夜精品福利在线观看| 国产精自产拍久久久久久| 亚洲国产三级网| 久久久久国产精品一区| 69视频在线免费观看| 亚洲精选中文字幕| 欧美日韩在线看| 麻豆国产精品va在线观看不卡| 在线视频日本亚洲性| 成人午夜一级二级三级| 黄色成人在线播放| 亚洲精品小视频在线观看| 欧美电影院免费观看| 96精品久久久久中文字幕| 久久91超碰青草是什么| 久久久最新网址| 久久综合久久88| 一区三区二区视频| 欧美视频免费在线| 91系列在线观看| 久久99国产精品久久久久久久久| 欧美丰满少妇xxxxx| 国产成人+综合亚洲+天堂| 一区二区福利视频| 91在线观看免费| 欧美日韩国产黄| 亚洲精品中文字幕女同| 一本色道久久综合亚洲精品小说| 国产91精品久久久久久| 亚洲精品少妇网址| 国产精品99久久久久久久久久久久| 菠萝蜜影院一区二区免费| 91影院在线免费观看视频| 91亚洲国产成人久久精品网站| 福利视频第一区| 亚洲开心激情网| 2025国产精品视频| 免费99精品国产自在在线| 成人免费黄色网| 91手机视频在线观看| 成人免费视频a| 国产suv精品一区二区| 亚洲国产精品国自产拍av秋霞| 久久精品99无色码中文字幕| 中文字幕欧美日韩va免费视频| 成人中心免费视频| 国产成人精品电影久久久| 久久99久久久久久久噜噜| 久久人人爽国产| 久久黄色av网站| 日本精品视频在线观看| 亚洲欧美在线播放| 最近2019免费中文字幕视频三| 一二美女精品欧洲| 日韩精品中文字幕视频在线| 国产精品爱啪在线线免费观看| 日韩精品免费观看| 琪琪亚洲精品午夜在线| 亚洲免费一级电影| 亚洲a在线播放| 欧美中文字幕在线视频| 欧美激情一区二区久久久| 亚洲综合社区网| 成人亚洲激情网| 日韩中文字幕在线免费观看| 久久久国产视频91| 91手机视频在线观看| 国产精品免费电影| 欧美黄色片视频| 欧美—级高清免费播放| 91av国产在线|