国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#基礎(chǔ)--線程Thread和線程池ThreadPool

這篇具有很好參考價值的文章主要介紹了C#基礎(chǔ)--線程Thread和線程池ThreadPool。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C#基礎(chǔ)–線程Thread和線程池ThreadPool

一、線程 Thread

1. 開啟一個線程

ThreadStart 是屬于System.Threading 中的一個內(nèi)置委托

ThreadStart threadStart = () =>
{
    this.DoSomethingLong("btnThread_Click");
};

Thread thread = new Thread(threadStart);	//傳入委托
thread.Start(); //開啟一個新線程  

ParameterizedThreadStart 是屬于System.Threading 中的一個內(nèi)置委托

ParameterizedThreadStart threadStart = ar =>
{
    this.DoSomethingLong("btnThread_Click");
};
Thread thread = new Thread(threadStart);
thread.Start(); //開啟一個新線程

2. 暫停/恢復(fù)線程

無法實時的去 “暫停 ” 或者 “恢復(fù)” 線程,因為線程是由系統(tǒng)調(diào)度執(zhí)行的,而且中間存在一個延時現(xiàn)象,不可能直接幫你執(zhí)行

thread.Suspend();	// 暫停線程
thread.Resume();	//恢復(fù)  無法實時的去暫停或者恢復(fù)線程 

3. 終結(jié)線程

在調(diào)用Abort()方法的線程上引發(fā) System.Threading.ThreadAbortException,以開始終止此線程的過程。 調(diào)用此方法通常會終止線程。

Thread.ResetAbort() 也會存在一定的延遲問題

thread.Abort();	//終結(jié)線程
Thread.ResetAbort();	//終結(jié)的線程繼續(xù)執(zhí)行

4. 等待任務(wù)

根據(jù)線程狀態(tài)等待

ThreadState 是一種枚舉類型

while (thread.ThreadState != ThreadState.Stopped)
{
    Thread.Sleep(200);
}

Join等待

限時等待,和委托中的 WaitOne等待 很像

thread.Join();	//無限時等待
thread.Join(2000); 	//最多等待2000毫秒

5. 線程調(diào)度優(yōu)先級

Priority 是一種枚舉類型,設(shè)置了的話只是增加它的優(yōu)先概率,并不能一定能保證它實現(xiàn)正確的優(yōu)先級執(zhí)行(因為CPU是分核的)

thread.Priority = ThreadPriority.Highest;

6. 后臺/前臺線程

后臺線程:進程結(jié)束,線程也結(jié)束;例如,winform 功能在控制臺輸出,關(guān)閉winform窗體,控制臺窗口也會立即關(guān)閉

前臺線程:進程結(jié)束后,任務(wù)執(zhí)行完畢以后,線程才結(jié)束;例如,winform 功能在控制臺輸出,關(guān)閉winform窗體,控制臺窗口只有等線程任務(wù)完成后才會關(guān)閉

thread.IsBackground = true;	//后臺線程  進程結(jié)束,線程結(jié)束了
thread.IsBackground = false; //前臺線程   進程結(jié)束后,任務(wù)執(zhí)行完畢以后,線程才結(jié)束 

二、線程 Thread 擴展

1. 無返回結(jié)果

 private void ThreadWithCallBack(ThreadStart threadStart, Action actionCallback)
 {
     ThreadStart threadStart = new ThreadStart(() =>
                                                {
                                                    threadStart.Invoke();
                                                    actionCallback.Invoke();
                                                });
     Thread thread = new Thread(threadStart);
     thread.Start();
 }
ThreadStart threadStart1 = () =>
{
    Console.WriteLine("執(zhí)行任務(wù)");
};
Action action = () =>
{
    Console.WriteLine("執(zhí)行回調(diào)");
};
this.ThreadWithCallBack(threadStart1, action);

2. 開啟一個線程,并獲取返回結(jié)果

  • 擴展方法內(nèi)部開啟一個線程執(zhí)行任務(wù) – 執(zhí)行傳入的委托

  • 線程等待的工作封裝到另外一個委托,將委托返回出去,讓外部執(zhí)行:這樣就不會造成封裝方法內(nèi)阻塞(卡界面),調(diào)用封裝方法的程序可以繼續(xù)執(zhí)行之后的代碼

  • 需要結(jié)果的時候,再去執(zhí)行返回的委托;如果不需要的結(jié)果的話,就不必再去執(zhí)行返回的委托了

/// <summary>
/// 既要不卡界面,又需要返回結(jié)果  
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
private Func<T> ThreadWithReturn<T>(Func<T> func)
{
    T t = default(T);
    ThreadStart threadStart = new ThreadStart(() =>
                                              {
                                                  t = func.Invoke();
                                              });
    Thread thread = new Thread(threadStart);
    thread.Start();

    return new Func<T>(() =>
                       {
                           thread.Join();
                           return t;
                       });
}
Func<int> func = () =>
                    {
                        Thread.Sleep(5000);
                        return DateTime.Now.Year;
                    };
Func<int> FuncResult = this.ThreadWithReturn(func);
Console.WriteLine("同步執(zhí)行操作1--發(fā)短信");
Console.WriteLine("同步執(zhí)行操作2--發(fā)郵件");
Console.WriteLine("同步執(zhí)行操作3--統(tǒng)計信息");
Console.WriteLine("同步執(zhí)行操作4--更新ES數(shù)據(jù)"); 
int iResult = FuncResult.Invoke();  //如果需要得到執(zhí)行結(jié)果,是必須要等待的

三、線程池 ThreadPool

.NetFramework2.0 出現(xiàn)的

在Thread中對線程的管理需要我們自己去從操作,在不斷的開啟線程和銷毀中,存在很大的開銷,為了讓線程可以反復(fù)的使用,出現(xiàn)了池化思想!

線程池不僅可以節(jié)省資源,還可以控制線程總數(shù)量,防止濫用!

1. 開啟一個線程

ThreadPool.QueueUserWorkItem 需要傳入一個WaitCallback委托作為參數(shù)

WaitCallback是 System.Threading 內(nèi)置的一個委托

ThreadPool.QueueUserWorkItem(o =>
                             {
                                 this.DoSomethingLong("ThreadPool.QueueUserWorkItem1");	//開啟了一個線程
                             });
ThreadPool.QueueUserWorkItem(o =>
                             {
                                 Console.WriteLine($"第二個參數(shù):{o}");
                                 this.DoSomethingLong("ThreadPool.QueueUserWorkItem1");//開啟了一個線程
                             }, "Hyl");

C#基礎(chǔ)--線程Thread和線程池ThreadPool,C# .Net,c#,java,開發(fā)語言

2. 設(shè)置/獲取 最大最小線程

設(shè)置線程數(shù)量是全局,線程池是全局,Task、async/awit 都是來自于線程,所以本人不建議大家隨便設(shè)置!

設(shè)置線程最大數(shù)量的時候,數(shù)量不能低于本計算機的核數(shù),否則設(shè)置無效。如下圖效果圖:(2047,1000 是默認(rèn)設(shè)置)

ThreadPool.SetMaxThreads(2, 2); //這里在設(shè)置的時候,數(shù)量不能低于本計算機的 核數(shù)
ThreadPool.SetMinThreads(2, 2);

ThreadPool.GetMaxThreads(out int maxWorkerThreads1, out int maxCompletionPortThreads1);
ThreadPool.GetMinThreads(out int minWorkerThreads1, out int minCompletionPortThreads1);

Console.WriteLine($"當(dāng)前電腦最大workerThreads={maxWorkerThreads1},最大的completionPortThreads={maxCompletionPortThreads1}");
Console.WriteLine($"當(dāng)前電腦最小workerThreads={minWorkerThreads1},最小的completionPortThreads={minCompletionPortThreads1}");

C#基礎(chǔ)--線程Thread和線程池ThreadPool,C# .Net,c#,java,開發(fā)語言

3. 線程等待

ManualResetEvent manualResetEvent = new ManualResetEvent(false); //開關(guān)關(guān)閉 
ThreadPool.QueueUserWorkItem(o =>
                             {
                                 this.DoSomethingLong("btnThreadPool_Click1");
                                 Thread.Sleep(3000);
                                 manualResetEvent.Set();// 開關(guān)打開
                             });
manualResetEvent.WaitOne();	//執(zhí)行到這兒來的時候,我就等你給我發(fā)信號
Console.WriteLine("計算完成");

C#基礎(chǔ)--線程Thread和線程池ThreadPool,C# .Net,c#,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-588508.html

到了這里,關(guān)于C#基礎(chǔ)--線程Thread和線程池ThreadPool的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • c#使用ThreadPool

    c#使用ThreadPool

    ? ? ? ? 說到ThreadPool,都知道是線程池。在c#中,有很多方式可以實現(xiàn)線程。從時間上來排序,大概是這樣的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2種是最新的,之前的很少使用,如果是老項目,基本上前面用的多,而新項目,最好使用后面的2種,因為后面

    2024年02月16日
    瀏覽(13)
  • Java多線程---線程的創(chuàng)建(Thread類的基本使用)

    Java多線程---線程的創(chuàng)建(Thread類的基本使用)

    本文主要介紹Java多線程的相關(guān)知識, Thread的創(chuàng)建, 常用方法的介紹和使用, 線程狀態(tài)等. 文章目錄 前言 一. 線程和Thread類 1. 線程和Thread類 1.1 Thread類的構(gòu)造方法 1.2 啟用線程的相關(guān)方法 2. 創(chuàng)建第一個Java多線程程序 3. 使用Runnable對象創(chuàng)建線程 4. 使用內(nèi)部類創(chuàng)建線程 5. 使用Lamba

    2024年02月03日
    瀏覽(24)
  • Java 線程池(Thread Pools)詳解

    Java 線程池(Thread Pools)詳解

    目錄 1、線程池介紹 2、線程池執(zhí)行原理 3、線程池中的阻塞隊列 4、Java 線程池中的拒絕策略 5、Java 提供的創(chuàng)建線程池的方式 6、線程池的使用示例 7、ForkJoinPool 和 ThreadPool 的區(qū)別 1、線程池介紹 ???????? 線程池是一種重用線程的機制 ,用于提高線程的利用率和管理線程的

    2024年02月05日
    瀏覽(28)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運行機制)

    【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運行機制)

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 本章進一步研究多線程的運行機制。要求實現(xiàn)功能如下:創(chuàng)建2個線程,線程名稱分別為LED和BEEP。兩個線程的任務(wù)是連續(xù)5次打印本線程的名字后退出線程(注意:線程不執(zhí)行

    2024年02月03日
    瀏覽(30)
  • Java多線程 -Thread類的常用API

    Thread常用API說明 : Thread常用方法:獲取線程名稱getName()、設(shè)置名稱setName()、獲取當(dāng)前線程對象currentThread()。 至于Thread類提供的諸如:yield、join、interrupt、不推薦的方法 stop 、守護線程、線程優(yōu)先級等線程的控制方法,在開發(fā)中很少使用,這些方法會在高級篇以及后續(xù)需要用到

    2024年02月21日
    瀏覽(24)
  • 【JavaEE】Java中的多線程 (Thread類)

    【JavaEE】Java中的多線程 (Thread類)

    作者主頁: paper jie_博客 本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于《JavaEE》專欄,本專欄是針對于大學(xué)生,編程小白精心打造的。筆者用重金(時間和精力)打造,將基礎(chǔ)知識一網(wǎng)打盡,希望可以幫到讀者們哦。 其他專欄:《MySQL》《

    2024年02月05日
    瀏覽(28)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 6. 線程創(chuàng)建應(yīng)用(線程掛起與恢復(fù))

    【STM32&RT-Thread零基礎(chǔ)入門】 6. 線程創(chuàng)建應(yīng)用(線程掛起與恢復(fù))

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 在上一個任務(wù)中,通過停止命令把線程刪除后,線程在系統(tǒng)中就不存在了,也無法再使線程重新運行。例如輸入stop_led_thread命令后,led停止閃爍,但也無法重新開啟LED燈閃爍

    2024年02月11日
    瀏覽(16)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 4. 線程介紹(理論)

    【STM32&RT-Thread零基礎(chǔ)入門】 4. 線程介紹(理論)

    前文中的最后一個任務(wù)發(fā)現(xiàn),一個main()函數(shù)很難同時實現(xiàn)按鍵功能和閃燈功能,就好像人很難同時完成左手畫圓右手畫方一樣,這種情況可以安排一人去畫圓、一人去畫方,并行進行就很容易了,兩人各司其職,互不干擾。 操作系統(tǒng)中,一個線程就像做事的一個人。一個操作

    2024年02月12日
    瀏覽(18)
  • 【Java系列】詳解多線程(二)——Thread類及常見方法(下篇)

    【Java系列】詳解多線程(二)——Thread類及常見方法(下篇)

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【Java系列專欄】【JaveEE學(xué)習(xí)專欄】 本專欄旨在分享學(xué)習(xí)Java的一點學(xué)習(xí)心得,歡迎大家在評論區(qū)交流討論?? 在操作系統(tǒng)中創(chuàng)建線程時,通常會同時創(chuàng)建相應(yīng)的PCB并將其

    2024年02月04日
    瀏覽(22)
  • 【Java系列】詳解多線程(二)——Thread類及常見方法(上篇)

    【Java系列】詳解多線程(二)——Thread類及常見方法(上篇)

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【Java系列專欄】【JaveEE學(xué)習(xí)專欄】 本專欄旨在分享學(xué)習(xí)Java的一點學(xué)習(xí)心得,歡迎大家在評論區(qū)交流討論?? 我們先來回顧一下線程與進程之間的聯(lián)系。 我們知道多進程

    2024年02月04日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包