可以認為線程是一個虛擬進程,用於獨立運行一個特定的程序。
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.終止線程
...