線程 被定義為程序的執行路徑。每個線程都定義了一個獨特的控制流。如果您的應用程序涉及到復雜的和耗時的操作,那麼設置不同的線程執行路徑往往是有益的,每個線程執行特定的工作。
線程是輕量級進程。一個使用線程的常見實例是現代操作系統中並行編程的實現。使用線程節省了 CPU 周期的浪費,同時提高了應用程序的效率。
到目前為止我們編寫的程序是一個單線程作為應用程序的運行實例的單一的過程運行的。但是,這樣子應用程序同時只能執行一個任務。為了同時執行多個任務,它可以被劃分為更小的線程。
線程生命周期開始於 System.Threading.Thread 類的對象被創建時,結束於線程被終止或完成執行時。
下面列出了線程生命周期中的各種狀態:
在 C# 中,System.Threading.Thread 類用於線程的工作。它允許創建並訪問多線程應用程序中的單個線程。進程中第一個被執行的線程稱為主線程。
當 C# 程序開始執行時,主線程自動創建。使用 Thread 類創建的線程被主線程的子線程調用。您可以使用 Thread 類的 CurrentThread 屬性訪問線程。
下面的程序演示了主線程的執行:
using System; using System.Threading; namespace MultithreadingApplication { class MainThreadProgram { static void Main(string[] args) { Thread th = Thread.CurrentThread; th.Name = "MainThread"; Console.WriteLine("This is {0}", th.Name); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
This is MainThread
下表列出了 Thread 類的一些常用的 屬性:
下表列出了 Thread 類的一些常用的 方法:
線程是通過擴展 Thread 類創建的。擴展的 Thread 類調用 Start() 方法來開始子線程的執行。
下面的程序演示了這個概念:
using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
In Main: Creating the Child thread Child thread starts
Thread 類提供了各種管理線程的方法。
下面的實例演示了 sleep() 方法的使用,用於在一個特定的時間暫停線程。
using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { Console.WriteLine("Child thread starts"); // 線程暫停 5000 毫秒 int sleepfor = 5000; Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000); Thread.Sleep(sleepfor); Console.WriteLine("Child thread resumes"); } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
In Main: Creating the Child thread Child thread starts Child Thread Paused for 5 seconds Child thread resumes
Abort() 方法用於銷毀線程。
通過拋出 threadabortexception 在運行時中止線程。這個異常不能被捕獲,如果有 finally 塊,控制會被送至 finally 塊。
下面的程序說明了這點:
using System; using System.Threading; namespace MultithreadingApplication { class ThreadCreationProgram { public static void CallToChildThread() { try { Console.WriteLine("Child thread starts"); // 計數到 10 for (int counter = 0; counter <= 10; counter++) { Thread.Sleep(500); Console.WriteLine(counter); } Console.WriteLine("Child Thread Completed"); } catch (ThreadAbortException e) { Console.WriteLine("Thread Abort Exception"); } finally { Console.WriteLine("Couldn't catch the Thread Exception"); } } static void Main(string[] args) { ThreadStart childref = new ThreadStart(CallToChildThread); Console.WriteLine("In Main: Creating the Child thread"); Thread childThread = new Thread(childref); childThread.Start(); // 停止主線程一段時間 Thread.Sleep(2000); // 現在中止子線程 Console.WriteLine("In Main: Aborting the Child thread"); childThread.Abort(); Console.ReadKey(); } } }
當上面的代碼被編譯和執行時,它會產生下列結果:
In Main: Creating the Child thread Child thread starts 0 1 2 In Main: Aborting the Child thread Thread Abort Exception Couldn't catch the Thread Exception