国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ThreadPool線程池 小結

2019-11-17 02:48:30
字體:
來源:轉載
供稿:網友

ThreadPool線程池 小結

ThreadPool類提供一個線程池,該線程池可用于發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器


線程池通過為應用程序提供一個由系統管理的輔助線程池使您可以更為有效地使用線程。一個線程監視排到線程池的若干個等待操作的狀態。當一個等待操作完成時,線程池中的一個輔助線程就會執行對應的回調函數

托管線程池中的線程為后臺線程,即它們的 IsBackground 屬性為 true。這意味著在所有的前臺線程都已退出后,ThreadPool 線程不會讓應用程序保持運行

也可以將與等待操作不相關的工作項排列到線程池。若要請求由線程池中的一個線程來處理工作項,請調用 QueueUserWorkItem 方法。此方法將對將被從線程池中選定的線程調用的方法或委托的引用用作參數。一個工作項排入隊列后就無法再取消它。

計時器隊列中的計時器以及已注冊的等待操作也使用線程池。它們的回調函數也會排列到線程池。

每個進程都有一個線程池。線程池的默認大小為每個可用處理器有 25 個線程。使用 SetMaxThreads 方法可以更改線程池中的線程數。每個線程使用默認的堆棧大小并按照默認的優先級運行

示例代碼:

using System;using System.Threading;public class Example{    public static void Main()    {        string str = "param";        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadPRoc), str);        Thread.Sleep(1000);           Console.ReadKey();    }    static void ThreadProc(Object stateInfo)    {        Console.WriteLine(stateInfo);    }}

QueueUserWorkItem方法將指定的方法排入隊列以便執行,并指定包含該方法所用數據的對象

1.不傳遞參數

public static bool QueueUserWorkItem(WaitCallback callBack);

2.傳遞參數

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

如果將方法成功排入隊列,則為 true;否則為 false。如果排入隊列的方法僅需要單個數據項,可以將數據項強制轉換為類型 Object。如果該方法需要多個復雜數據,則必須定義包含這些數據的類。

什么時候使用ThreadPool

ThreadPool的作用:

另一種將任務項排列到線程池的方法,不過這個任務項是擁有等待操作的任務項

ThreadPool.RegisterWaitForSingleObject 方法 (WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)


注冊一個等待 WaitHandle 的委托(將擁有等待操作的任務項排列到線程池中),并指定一個 32 位有符號整數來表示超時值(以毫秒為單位)。

參數

waitObject
類型:System.Threading.WaitHandle要注冊的 WaitHandle。 使用 WaitHandle 而非 Mutex。
callBack
類型:System.Threading.WaitOrTimerCallback waitObject 參數終止時調用的 WaitOrTimerCallback 委托。
state
類型:System.Object傳遞給委托的對象。
millisecondsTimeOutInterval
類型:System.Int32以毫秒為單位的超時。 如果 millisecondsTimeOutInterval 參數為 0(零),函數將測試對象的狀態并立即返回。 如果 millisecondsTimeOutInterval 為 -1,則函數的超時間隔永遠不過期。
executeOnlyOnce
類型:System.Boolean 如果為 true,表示在調用了委托后,線程將不再在 waitObject 參數上等待;如果為 false,表示每次完成等待操作后都重置計時器,直到注銷等待。

返回值

類型:System.Threading.RegisteredWaitHandle封裝本機句柄的 RegisteredWaitHandle。

此方法返回的 RegisteredWaitHandle 使用完畢后,請調用其 RegisteredWaitHandle.Unregister 方法來釋放對等待句柄的引用。 我們建議始終調用 RegisteredWaitHandle.Unregister 方法,即使將 executeOnlyOnce 指定為 true 也是如此。 如果調用 RegisteredWaitHandle.Unregister 方法而不是取決于注冊的等待句柄的終結器,則垃圾回收的工作效率更高。

RegisterWaitForSingleObject 方法將指定的委托排隊到線程池。 當發生以下情況之一時,輔助線程將執行委托:

  • 指定對象處于終止狀態()。

  • 超時間隔已過期。

RegisterWaitForSingleObject 方法檢查指定對象的 WaitHandle 的當前狀態。 如果對象狀態為非終止狀態,則此方法將注冊一個等待操作。 此等待操作由線程池中的一個線程來執行。 當對象狀態變為終止或超時間隔已過期時,委托由輔助線程執行。 如果 timeOutInterval 參數不為 0(零),并且 executeOnlyOnce 參數為 false,則每當事件收到信號或超時間隔過期時都會重置計時器。

using System;using System.Threading;using System.Runtime.CompilerServices;public class ClassForMain{    private static int i = 0;    public static void Main(string[] args)    {        //設置WaitHandle的初始狀態為非終止狀態時,則此方法將注冊一個等待操作         AutoResetEvent argv = new AutoResetEvent(false);        //將超時值設置為2000毫秒,超時間隔已過期時輔助線程將執行委托        ThreadPool.RegisterWaitForSingleObject(argv, new WaitOrTimerCallback(workitem), null, 2000, false);        //設置WaitHandle的狀態為終止狀態輔助線程將執行委托        argv.Set();        Console.Read();    }    public static void workitem(object O, bool signaled)    {        i += 1;        Console.WriteLine("Thread Pool Work Item Invoked:" + i.ToString());    }}

參考文章:

  1. ThreadPool(線程池)in .Net
  2. C#線程同步的幾種方法
  3. 淺談ThreadPool 線程池
  4. ThreadPool 類
  5. ThreadPool(線程池)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开封市| 星座| 三穗县| 顺平县| 西宁市| 津市市| 顺昌县| 余江县| 定日县| 武冈市| 贵德县| 吕梁市| 库车县| 莱阳市| 黔南| 柯坪县| 万载县| 湘潭市| 宝应县| 绥中县| 泸州市| 河北区| 嵩明县| 宁国市| 精河县| 利川市| 兰溪市| 苍山县| 韶山市| 澄城县| 缙云县| 利津县| 育儿| 盐边县| 拜城县| 乌鲁木齐市| 四川省| 铅山县| 丹寨县| 青海省| 张家口市|