中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Thread類在c# 中如何使用

發布時間:2020-11-06 15:36:37 來源:億速云 閱讀:237 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關Thread類在c# 中如何使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

  Thread類相對于線程池中的線程,使用者有更多的控制權。該類允許創建前臺線程,設置線程優先級等。Thread類的構造函數重載為接受ThreadStart和ParameterizedThreadStart類型的委托參數。

1、給線程傳遞數據

  給線程傳遞數據的兩種方式:

  1.使用帶ParameterizedThreadStart委托參數的Thread構造函數:

//定義一個數據類型,傳遞給線程
public struct Data
{
  public string Message;
}
//創建一個方法,將方法給線程的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" };//創建一個數據實例
  Thread t2 = new Thread(ThreadMainWithParameters);//創建線程
  t2.Start(d);//啟動線程,并傳遞參數
}

  2.自定義一個類,把線程的方法定義為實例方法,然后初始化實例的數據后啟動線程。

//定義一個類,用于存放線程需要的數據和線程啟動的方法
public class MyThread
{
  private string data;//線程數據

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

2、后臺線程

  如果應用程序內有任何一個前臺線程在運行,那么應用程序就在運行。Thread類創建的線程默認時前臺線程,線程池中創建的線程是后臺線程。在使用Thread類創建線程時,可以設置IsBackground屬性,以設置創建的Thread線程時后臺線程還是前臺線程。例如:

//創建線程方法,以在主線程中調用
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
   * *****************************************/
}

  可以看到,主線程先完成任務。但是主線程內啟動的新線程是前臺線程(默認),導致主線程結束任務后,新線程仍在寫入控制臺輸出。如果在線程啟動前,將線程的IsBackground屬性設置為true,主線程結束時,會終止新線程的執行(不論是否完成任務)。

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...
   * *****************************************/
}

  后臺線程適合用于完成后臺任務。

3、線程的優先級

  線程由操作系統調度。給線程指定優先級,將影響線程調度順序。優先級越高的線程,將會得到系統優先調度在CPU上運行。如果線程在等待資源,它就會停止運行,并釋放CPU。

  線程必須等待的可能原因:響應睡眠指令、等待磁盤I/O完成、等待網絡包到達等。如果線程不主動釋放CPU,線程調度器就會搶占該線程。線程由一個時間量,它可以持續使用CPU,直到時間到達(如果沒有更高優先級的線程時)。如果優先級相同的多個線程等待CPU,線程調度器會使用一個循環調度原則,將CPU逐一交個線程使用。如果線程被其他線程搶占,那么它會排隊到最后去。

  只有優先級相同的多個線程同時在運行時,才能用上時間量和循環規則。優先級是動態的:如果線程是CPU密集型,一直需要CPU,而且不等待資源,其優先級就降低為用該線程定義的基本優先級;如果線程在等待資源,它的優先級會提高。由于優先級的提高,所以線程可能在下一等待結束時獲得CPU。

  線程的Priority屬性,可以設置線程的優先級。線程指定優先級時,可能降低其他線程的運行概率。所以,可以根據需要短暫改變優先級。

4、控制線程

  調用Thread對象的Start()方法可以創建線程。但是,新線程并不是出于Running狀態,而是Unstarted狀態。當線程調度器調用線程時,線程則會改為Running狀態。其ThreadState屬性可以獲得線程的狀態。

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

  如果要停止一個線程,可以調用方法Abort()。調用該方法,會在接到終止命令的線程中拋出ThreadAbortException類型異常。捕獲該異常,可以在線程結束前做一些清理工作。如果再調用方法ResetAbort(),可能有機會再收到異常后繼續運行。如果線程沒有重置,接收到終止請求的線程的狀態就從AbortRequested改為Aborted。

  調用Join()方法可以等待線程的結束。該方法會停止當前線程,并把它設置為WaitSleepJoin狀態,直到加入的線程完成。

上述就是小編為大家分享的Thread類在c# 中如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

时尚| 开远市| 儋州市| 芮城县| 霞浦县| 舟山市| 汾阳市| 崇礼县| 罗平县| 古丈县| 枣强县| 安多县| 沾化县| 肃南| 平潭县| 沽源县| 佳木斯市| 泸水县| 北京市| 黑龙江省| 阳春市| 武清区| 文登市| 防城港市| 凌海市| 松原市| 海盐县| 徐汇区| 射阳县| 新平| 留坝县| 宾阳县| 开封市| 乌审旗| 泽普县| 榆林市| 三门县| 牙克石市| 同心县| 驻马店市| 德惠市|