最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#線程池ThreadPool用法簡介

 更新時間:2022年06月08日 08:58:53   作者:springsnow  
這篇文章介紹了C#線程池ThreadPool的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、ThreadPool概述

提供一個線程池,該線程池可用于執(zhí)行任務、發(fā)送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。

創(chuàng)建線程需要時間。如果有不同的小任務要完成,就可以事先創(chuàng)建許多線程/在應完成這些任務時發(fā)出請求。不需要自己創(chuàng)建這樣一個列表。該列表由ThreadPool類托管。

這個類會在需要時增減池中線程的線程數,直到最大的線程數。

如果有更多的作業(yè)要處理,線程池中線程的個數也達到了極限,最新的作業(yè)就要排隊,且必須等待線程完成其任務。

線程池使用起來很簡單,但它有一些限制

  • 線程池中的所有線程都是后臺線程。如果進程的所有前臺線程都結束了,所有的后臺線程 就會停止。不能把入池的線程改為前臺線程。
  • 不能給入池的線程設置優(yōu)先級或名稱。
  • 對于COM對象,入池的所有線程都是多線程單元(multithreaded apartment, MTA)線程。許 多COM對象都需要單線程單元(single-threaded apartment, MTA)線程。
  • 入池的線程只能用于時間較短的任務。如果線程要一直運行(如Word的拼寫檢杳器線程), 就應使用Thread類創(chuàng)建一個線程.

使用線程池線程的操作的情況包括

  • 當您創(chuàng)建Task或Task對象以異步方式執(zhí)行某項任務,默認情況下任務調度在線程池線程上運行的。
  • 異步計時器使用線程池。 線程池線程從System.Threading.Timer類執(zhí)行回調,和從System.Timers.Timer類引發(fā)事件。
  • 當使用已注冊的等待句柄時,系統(tǒng)線程監(jiān)視等待句柄的狀態(tài)。 等待操作完成后,從線程池的工作線程將執(zhí)行相應的回調函數。
  • 當您調用QueueUserWorkItem方法進行排隊,以在線程池線程上執(zhí)行的方法。 為此,可將該方法傳遞WaitCallback委托。

二、方法

  • GetAvailableThreads(Int32, Int32):檢索由 GetMaxThreads(Int32, Int32) 方法返回的最大線程池線程數和當前活動線程數之間的差值。
  • GetMaxThreads(Int32, Int32) :檢索可以同時處于活動狀態(tài)的線程池請求的數目。 所有大于此數目的請求將保持排隊狀態(tài),直到線程池線程變?yōu)榭捎谩?/li>
  • SetMaxThreads(Int32, Int32) :設置可以同時處于活動狀態(tài)的線程池的請求數目。 所有大于此數目的請求將保持排隊狀態(tài),直到線程池線程變?yōu)榭捎谩?/li>
  • GetMinThreads(Int32, Int32):發(fā)出新的請求時,在切換到管理線程創(chuàng)建和銷毀的算法之前檢索線程池按需創(chuàng)建的線程的最小數量。
  • SetMinThreads(Int32, Int32):發(fā)出新的請求時,在切換到管理線程創(chuàng)建和銷毀的算法之前設置線程池按需創(chuàng)建的線程的最小數量。
  • QueueUserWorkItem(WaitCallback, Object):將方法排入隊列以便執(zhí)行,并指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執(zhí)行。
  • RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) :注冊一個等待 WaitHandle 的委托,并指定一個 32 位有符號整數來表示超時值(以毫秒為單位)。

三、設置和獲取線程數方法

池中的最大線程數是可配置的。在雙核CPU中,默認設置為1023 個工作線程和1000個I/O線程。也可以指定在創(chuàng)建線程池時應立即啟動的最小線程數,以及線程池 中可用的最大線程數。

int i = 0;
int j = 0;
//前面是輔助(也就是所謂的工作者)線程,后面是I/O線程
ThreadPool.GetMaxThreads(out i, out j);
Console.WriteLine(i.ToString() + "   " + j.ToString()); //默認都是1000

//獲取空閑線程,由于現在沒有使用異步線程,所以為空
ThreadPool.GetAvailableThreads(out i, out j);
Console.WriteLine(i.ToString() + "   " + j.ToString()); //默認都是1000

四、將方法排入隊列以便執(zhí)行:QueueUserWorkItem(WaitCallback, Object)

將方法排入隊列以便執(zhí)行,并指定包含該方法所用數據的對象。 此方法在有線程池線程變得可用時執(zhí)行。

public static bool QueueUserWorkItem (System.Threading.WaitCallback callBack, object state);

實例:

static void Main(string[] args)
 {
     Person p = new Person(1, "劉備");
     //啟動工作者線程
     ThreadPool.QueueUserWorkItem(new WaitCallback(RunWorkerThread), p);
 }

static void RunWorkerThread(object obj)
 {
     Thread.Sleep(200);
     Console.WriteLine("線程池線程開始!");
     Person p = obj as Person;
     Console.WriteLine(p.Name);
 }


 public class Person
 {
     public Person(int id, string name) { Id = id; Name = name; }
     public int Id { get; set; }
     public string Name { get; set; }
 }

五、RegisterWaitForSingleObject 注冊等待句柄

注冊一個等待 WaitHandle 的委托,并指定一個數來表示超時值(以毫秒為單位)。

將指定的方法排隊到線程池,當超時或者等待委托接收到信號時,輔助線程將執(zhí)行此方法,即主線程控制輔助線程什么時候開始執(zhí)行。

public static System.Threading.RegisteredWaitHandle RegisterWaitForSingleObject (System.Threading.WaitHandle waitObject, System.Threading.WaitOrTimerCallback callBack, object state, int millisecondsTimeOutInterval, bool executeOnlyOnce);

1、參數

  • waitObject:要注冊的 WaitHandle。 使用 WaitHandle 而非 Mutex。
  • callBack :向 waitObject 參數發(fā)出信號時調用的 WaitOrTimerCallback 委托。
  • state:傳遞給委托的對象。
  • millisecondsTimeOutInterval:以毫秒為單位的超時。 
    如果為0(零),函數將測試對象的狀態(tài)并立即返回。 如果為 -1,則函數的超時間隔永遠不過期。表示間隔幾秒執(zhí)行回調方法,指當剛加入線程后,它是需要過了幾秒后才會第一次執(zhí)行回調方法。如果使用了wait.Set()方法使用立即執(zhí)行回調函數而不需要等待。
  • executeOnlyOnce:如果為 true,表示在調用了委托后,線程將不再在 waitObject 參數上等待;如果為 false,表示每次完成等待操作后都重置計時器,直到注銷等待。

2、返回

  • RegisteredWaitHandle:封裝本機句柄的 RegisteredWaitHandle。
// TaskInfo contains data that will be passed to the callback method.
public class TaskInfo
{
    public RegisteredWaitHandle Handle = null;
    public string OtherInfo = "default";
}


public static void Main(string[] args)
{
    // 主線程使用AutoResetEvent來給已注冊的等待句柄發(fā)信號, 此等待句柄執(zhí)行回調方法
    AutoResetEvent ev = new AutoResetEvent(false);

    TaskInfo ti = new TaskInfo();
    ti.OtherInfo = "First task";
    // 該任務的TaskInfo包括RegisterWaitForSingleObject返回的已注冊的等待句柄。這允許在對象被發(fā)出一次信號時終止等待(參見WaitProc)。
    ti.Handle = ThreadPool.RegisterWaitForSingleObject(
        ev,
        new WaitOrTimerCallback(WaitProc),
        ti,
        1000,
        false
    );

    // 主線程等待三秒,為了演示隊列中的線程超時,然后發(fā)信號.
    Thread.Sleep(3100);
    Console.WriteLine("Main thread signals.");
    ev.Set();//發(fā)信號

    // 主線程休眠,這應該給回調方法執(zhí)行的時間。如果注釋掉這一行,程序通常會在ThreadPool線程執(zhí)行之前結束。
    Thread.Sleep(1000);
    / /如果您自己啟動一個線程,您可以通過調用thread . join來等待它結束。此選項在線程池線程中不可用。
}

//當注冊的等待時間超時,或者WaitHandle(在本例中是AutoResetEvent)發(fā)出信號時,回調方法執(zhí)行。WaitProc在事件第一次發(fā)出信號時注銷WaitHandle。.
public static void WaitProc(object state, bool timedOut)
{
    TaskInfo ti = (TaskInfo)state;

    string cause = "TIMED OUT";
    if (!timedOut) //如果Timeout為false,表示接收到的信號后執(zhí)行的
    {
        cause = "SIGNALED";
        //如果回調方法執(zhí)行的話是因為WaitHandle觸發(fā)信號的話,則用反注冊等待句柄來取消回調方法將來的執(zhí)行。
        if (ti.Handle != null)
            ti.Handle.Unregister(null);//
    }

    Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",
        ti.OtherInfo, Thread.CurrentThread.GetHashCode().ToString(), cause);//超時后執(zhí)行的
}

結果如下:

WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
WaitProc( First task ) executes on thread 7; cause = TIMED OUT.
Main thread signals.
WaitProc( First task ) executes on thread 7; cause = SIGNALED.

到此這篇關于C#線程池ThreadPool的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#中的靜態(tài)成員、靜態(tài)方法、靜態(tài)類介紹

    C#中的靜態(tài)成員、靜態(tài)方法、靜態(tài)類介紹

    本文主要介紹了C#中的靜態(tài)成員、靜態(tài)方法、靜態(tài)類的基礎的使用,并做了相關的代碼演示,供初學者參考。
    2016-03-03
  • c# 兩種發(fā)送郵件的方法

    c# 兩種發(fā)送郵件的方法

    這篇文章主要介紹了c# 兩種發(fā)送郵件的方法,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#集合本質之鏈表的用法詳解

    C#集合本質之鏈表的用法詳解

    本文詳細講解了C#集合本質之鏈表的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C# PC版微信消息監(jiān)聽自動回復的實現方法

    C# PC版微信消息監(jiān)聽自動回復的實現方法

    這篇文章主要介紹了C# PC版微信消息監(jiān)聽自動回復的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Unity利用材質自發(fā)光實現物體閃爍

    Unity利用材質自發(fā)光實現物體閃爍

    這篇文章主要為大家詳細介紹了Unity利用材質自發(fā)光實現物體閃爍,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C#自定義事件模擬風吹草搖擺效果

    C#自定義事件模擬風吹草搖擺效果

    這篇文章主要介紹了C#自定義事件模擬風吹草搖擺效果,草地上每一顆草都監(jiān)聽HoverTreeWindEvent事件,根據風向(WindDdirection)調整姿態(tài)。需要的朋友可以參考下
    2017-08-08
  • 3種方法實現WindowsForm切換窗口

    3種方法實現WindowsForm切換窗口

    這篇文章主要介紹了3種方法實現WindowsForm切換窗口,文中講解非常詳細,示例代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#調用C類型dll入參為struct的問題詳解

    C#調用C類型dll入參為struct的問題詳解

    這篇文章主要給大家介紹了關于C#調用C類型dll入參為struct問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C#線程倒計時器源碼分享

    C#線程倒計時器源碼分享

    這篇文章主要為大家分享了C#線程倒計時器源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c#中判斷類是否繼承于泛型基類

    c#中判斷類是否繼承于泛型基類

    這篇文章主要介紹了c#中判斷類是否繼承于泛型基類,最簡單的辦法肯定是typeof(b).baseType=typeof(a<string>)這樣就可以返回true,但是這種方法時不妥的,下面看看如何解決這個問題呢
    2022-04-04

最新評論

镶黄旗| 伊宁县| 海伦市| 万荣县| 崇州市| 丘北县| 搜索| 平定县| 茶陵县| 保山市| 兴文县| 阳东县| 华宁县| 来凤县| 屏山县| 旺苍县| 临邑县| 马山县| 浦县| 信丰县| 涞水县| 修文县| 光泽县| 竹北市| 龙门县| 舞钢市| 滁州市| 黔东| 嘉鱼县| 昌黎县| 兴宁市| 沁源县| 东兴市| 达拉特旗| 墨竹工卡县| 中牟县| 武威市| 信阳市| 陇南市| 亳州市| 汶川县|