欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# Thread類的用法詳解

 更新時(shí)間:2020年11月05日 09:15:59   作者:一只獨(dú)行的猿  
這篇文章主要介紹了c# Thread類的用法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#的相關(guān)知識(shí),感興趣的朋友可以了解下

  Thread類相對(duì)于線程池中的線程,使用者有更多的控制權(quán)。該類允許創(chuàng)建前臺(tái)線程,設(shè)置線程優(yōu)先級(jí)等。Thread類的構(gòu)造函數(shù)重載為接受ThreadStart和ParameterizedThreadStart類型的委托參數(shù)。

1、給線程傳遞數(shù)據(jù)

  給線程傳遞數(shù)據(jù)的兩種方式:

  1.使用帶ParameterizedThreadStart委托參數(shù)的Thread構(gòu)造函數(shù):

//定義一個(gè)數(shù)據(jù)類型,傳遞給線程
public struct Data
{
  public string Message;
}
//創(chuàng)建一個(gè)方法,將方法給線程的ParameterizedThreadStart委托
static void ThreadMainWithParameters(object obj)
{
  Data d = (Data)obj;
  Console.WriteLine("Running in a thread, received {0}", d.Message);
}
static void Main()
{
  Data d = new Data { Message = "Info" };//創(chuàng)建一個(gè)數(shù)據(jù)實(shí)例
  Thread t2 = new Thread(ThreadMainWithParameters);//創(chuàng)建線程
  t2.Start(d);//啟動(dòng)線程,并傳遞參數(shù)
}

  2.自定義一個(gè)類,把線程的方法定義為實(shí)例方法,然后初始化實(shí)例的數(shù)據(jù)后啟動(dòng)線程。

//定義一個(gè)類,用于存放線程需要的數(shù)據(jù)和線程啟動(dòng)的方法
public class MyThread
{
  private string data;//線程數(shù)據(jù)

  public MyThread(string data)
  {
    this.data = data;
  }
  //線程啟動(dòng)方法
  public void ThreadMain()
  {
    Console.WriteLine("Running in a thread, data: {0}", data);
  }
}
static void Main()
{
  MyThread obj = new MyThread("info");//創(chuàng)建實(shí)例信息
  Thread t3 = new Thread(obj.ThreadMain);//啟動(dòng)實(shí)例方法
  t3.Start();
}

2、后臺(tái)線程

  如果應(yīng)用程序內(nèi)有任何一個(gè)前臺(tái)線程在運(yùn)行,那么應(yīng)用程序就在運(yùn)行。Thread類創(chuàng)建的線程默認(rèn)時(shí)前臺(tái)線程,線程池中創(chuàng)建的線程是后臺(tái)線程。在使用Thread類創(chuàng)建線程時(shí),可以設(shè)置IsBackground屬性,以設(shè)置創(chuàng)建的Thread線程時(shí)后臺(tái)線程還是前臺(tái)線程。例如:

//創(chuàng)建線程方法,以在主線程中調(diào)用
static void ThreadMain()
{
  Console.WriteLine("Thread {0} started", Thread.CurrentThread.Name);
  Thread.Sleep(3000);
  Console.WriteLine("Thread {0} completed", Thread.CurrentThread.Name);
}
static void Main()
{
  Thread t1 = new Thread(ThreadMain);  t1.Name = "MyNewThread";
  t1.Start();   Thread.Sleep(100);
  Console.WriteLine("Main thread ending now...");
  /*******************輸出********************     *          Thread MyNewThread started
   *     Main thread ending now...
   *     Thread MyNewThread completed
   * *****************************************/
}

  可以看到,主線程先完成任務(wù)。但是主線程內(nèi)啟動(dòng)的新線程是前臺(tái)線程(默認(rèn)),導(dǎo)致主線程結(jié)束任務(wù)后,新線程仍在寫入控制臺(tái)輸出。如果在線程啟動(dòng)前,將線程的IsBackground屬性設(shè)置為true,主線程結(jié)束時(shí),會(huì)終止新線程的執(zhí)行(不論是否完成任務(wù))。

static void Main()
{
  Thread t1 = new Thread(ThreadMain);
  t1.Name = "MyNewThread";
  t1.IsBackground = true;
  t1.Start();
  Thread.Sleep(100);
  Console.WriteLine("Main thread ending now...");
  /*******************輸出********************
   *     Thread MyNewThread started
   *     Main thread ending now...
   * *****************************************/
}

  后臺(tái)線程適合用于完成后臺(tái)任務(wù)。

3、線程的優(yōu)先級(jí)

  線程由操作系統(tǒng)調(diào)度。給線程指定優(yōu)先級(jí),將影響線程調(diào)度順序。優(yōu)先級(jí)越高的線程,將會(huì)得到系統(tǒng)優(yōu)先調(diào)度在CPU上運(yùn)行。如果線程在等待資源,它就會(huì)停止運(yùn)行,并釋放CPU。

  線程必須等待的可能原因:響應(yīng)睡眠指令、等待磁盤I/O完成、等待網(wǎng)絡(luò)包到達(dá)等。如果線程不主動(dòng)釋放CPU,線程調(diào)度器就會(huì)搶占該線程。線程由一個(gè)時(shí)間量,它可以持續(xù)使用CPU,直到時(shí)間到達(dá)(如果沒(méi)有更高優(yōu)先級(jí)的線程時(shí))。如果優(yōu)先級(jí)相同的多個(gè)線程等待CPU,線程調(diào)度器會(huì)使用一個(gè)循環(huán)調(diào)度原則,將CPU逐一交個(gè)線程使用。如果線程被其他線程搶占,那么它會(huì)排隊(duì)到最后去。

  只有優(yōu)先級(jí)相同的多個(gè)線程同時(shí)在運(yùn)行時(shí),才能用上時(shí)間量和循環(huán)規(guī)則。優(yōu)先級(jí)是動(dòng)態(tài)的:如果線程是CPU密集型,一直需要CPU,而且不等待資源,其優(yōu)先級(jí)就降低為用該線程定義的基本優(yōu)先級(jí);如果線程在等待資源,它的優(yōu)先級(jí)會(huì)提高。由于優(yōu)先級(jí)的提高,所以線程可能在下一等待結(jié)束時(shí)獲得CPU。

  線程的Priority屬性,可以設(shè)置線程的優(yōu)先級(jí)。線程指定優(yōu)先級(jí)時(shí),可能降低其他線程的運(yùn)行概率。所以,可以根據(jù)需要短暫改變優(yōu)先級(jí)。

4、控制線程

  調(diào)用Thread對(duì)象的Start()方法可以創(chuàng)建線程。但是,新線程并不是出于Running狀態(tài),而是Unstarted狀態(tài)。當(dāng)線程調(diào)度器調(diào)用線程時(shí),線程則會(huì)改為Running狀態(tài)。其ThreadState屬性可以獲得線程的狀態(tài)。

  線程類的靜態(tài)方法Sleep(),會(huì)使線程處于WaitSleepJoin狀態(tài),在等待一段時(shí)間后,線程將再次被喚醒。

  如果要停止一個(gè)線程,可以調(diào)用方法Abort()。調(diào)用該方法,會(huì)在接到終止命令的線程中拋出ThreadAbortException類型異常。捕獲該異常,可以在線程結(jié)束前做一些清理工作。如果再調(diào)用方法ResetAbort(),可能有機(jī)會(huì)再收到異常后繼續(xù)運(yùn)行。如果線程沒(méi)有重置,接收到終止請(qǐng)求的線程的狀態(tài)就從AbortRequested改為Aborted。

  調(diào)用Join()方法可以等待線程的結(jié)束。該方法會(huì)停止當(dāng)前線程,并把它設(shè)置為WaitSleepJoin狀態(tài),直到加入的線程完成。

以上就是c# Thread類的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于c# Thread類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實(shí)現(xiàn)簡(jiǎn)單的文件加密與解密方式

    C#實(shí)現(xiàn)簡(jiǎn)單的文件加密與解密方式

    這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的文件加密與解密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • DataGridView自定義單元格表示值、Error圖標(biāo)顯示的方法介紹

    DataGridView自定義單元格表示值、Error圖標(biāo)顯示的方法介紹

    這篇文章介紹了DataGridView自定義單元格表示值、Error圖標(biāo)顯示的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • C#判斷本地文件是否處于打開狀態(tài)的方法

    C#判斷本地文件是否處于打開狀態(tài)的方法

    這篇文章主要介紹了C#判斷本地文件是否處于打開狀態(tài)的方法,涉及C#操作文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C# 內(nèi)部類與Lambda表達(dá)式用法詳解

    C# 內(nèi)部類與Lambda表達(dá)式用法詳解

    Lambda表達(dá)式是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象,是一個(gè)匿名函數(shù),即沒(méi)有函數(shù)名的函數(shù);內(nèi)部類是將一個(gè)類定義在另一個(gè)給類里面或者方法里面,這樣的類就被稱為內(nèi)部類
    2021-10-10
  • C# 常見(jiàn)操作符整理

    C# 常見(jiàn)操作符整理

    操作符接受一個(gè)或多個(gè)參數(shù),并生成一個(gè)新值。操作符其實(shí)可以看做一個(gè)有返回值方法,但是參數(shù)的形式和調(diào)用和普通的調(diào)用不同。
    2011-02-02
  • C# 判斷字符串第一位是否為數(shù)字

    C# 判斷字符串第一位是否為數(shù)字

    C# 判斷字符串第一位是否為數(shù)字,需要的朋友可以參考一下
    2013-04-04
  • C#實(shí)現(xiàn)PDF文件添加圖片背景

    C#實(shí)現(xiàn)PDF文件添加圖片背景

    這篇文章主要介紹了C#實(shí)現(xiàn)PDF文件添加圖片背景的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解C#設(shè)計(jì)模式編程中生成器模式的使用

    詳解C#設(shè)計(jì)模式編程中生成器模式的使用

    這篇文章主要介紹了詳解C#設(shè)計(jì)模式編程中生成器模式的使用,生成器模式主張創(chuàng)建對(duì)象的過(guò)程和對(duì)象的表現(xiàn)應(yīng)該分離開來(lái),需要的朋友可以參考下
    2016-02-02
  • WPF中的導(dǎo)航框架概述

    WPF中的導(dǎo)航框架概述

    這篇文章介紹了WPF中的導(dǎo)航框架,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串

    C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串

    這篇文章主要介紹了C# 連接SQL數(shù)據(jù)庫(kù)的方法及常用連接字符串,有需要的朋友可以參考一下
    2014-01-01

最新評(píng)論