­

c#之執行緒基礎(一)

  • 2019 年 10 月 19 日
  • 筆記

可以認為執行緒是一個虛擬進程,用於獨立運行一個特定的程式。

1.使用c#創建執行緒

using System;  using System.Threading; //3    namespace MutiThreadDemo  {      class Program      {          static void Main(string[] args)          {
//5 Thread t
= new Thread(PrintNumber); t.Start(); PrintNumber(); Console.ReadLine(); } //4 static void PrintNumber() { Console.WriteLine("Starting ..."); for(int i = 1;i< 10; i++) { Console.WriteLine(i); } } } }

在上面的程式碼中,步驟4定義了方法 PrintNumber , 該方法會被主執行緒和新創建的執行緒使用。

在我們構造一個執行緒時,ThreadStart 或 ParameterizedThreadStart 的實例委託會傳給構造函數。

我們只需指定在不同執行緒運行的方法名,而 c# 編譯器則會在後台創建這些對象。

 

運行結果:兩組範圍為1 -10的數字會隨機交叉輸出。這說明了PringNumber方法同時運行在主執行緒和另一個執行緒。(如果10個數字隨機交叉不明顯,可以增加到100試試)

 

2.暫停執行緒

 這裡展示如何讓一個執行緒等待一段時間而不用消耗作業系統資源。

using System;  using System.Threading;    namespace MutiThreadDemo  {      class ThreadSleep      {          static void Main(string[] args)          {              Thread t = new Thread(PrintNumbersWithDelay);              t.Start();              PrintNumbers();              Console.ReadLine();          }            static void PrintNumbers()          {              Console.WriteLine("Starting ...");              for (int i = 0; i < 10; i++)              {                  Console.WriteLine(i);              }          }            static void PrintNumbersWithDelay()          {              Console.WriteLine("Starting ...");              for(int i = 0; i < 10; i++)              {                  Thread.Sleep(TimeSpan.FromSeconds(2));                  Console.WriteLine(i);              }          }      }  }

在PrintNumbersWithDeplay方法中加入了Thread.Sleep方法調用。這會導致執行緒在執行該程式碼時,在列印任何數字之前會等待指定的時間(這裡是2秒鐘)。

3.執行緒等待

這裡將展示如何讓程式等待另一個程式中的計算完成,然後在程式碼中使用該執行緒的計算結果

使用Thread.Sleep行不通,因為並不知道計算需要花費的具體時間。

using System;  using System.Threading;    namespace MutiThreadDemo  {      class Thread_Join      {          static void Main(string[] args)          {              Console.WriteLine("Starting ...");              Thread t = new Thread(PrintNumbersWithDeplay);              t.Start();              t.Join();              Console.WriteLine("Thread completed");              Console.ReadLine();          }            static void PrintNumbersWithDeplay()          {              Console.WriteLine("Starting ...");              for (int i = 1; i < 10; i++)              {                  Thread.Sleep(TimeSpan.FromSeconds(2));                  Console.WriteLine(i);              }          }        }  }

運行結果:

 

 當程式運行時,啟動了一個耗時較長的執行緒來列印數字,列印每個數字前要等待兩秒。

但是我們在主程式中調用了 t.Join 方法,該方法允許我們等待直到執行緒 t 完成。

當執行緒 t 完成時,主程式會繼續運行。

藉助該技術可以實現在兩個執行緒間同步執行步驟。

4.終止執行緒