在控制臺應用程序集中,Main方法開始的是一個線程。如果要再創建線程,需要用到System.Threading這個命名空間。
□ 線程是怎樣工作的?
CLR維護著一個叫"thread scheduler"的機制,這個機制與操作系統交互。"thread scheduler"保證所有的線程有合適的執行時間,那些等待或被阻塞的線程不會占有CPU時間。
在單處理器計算機上,"thread scheduler"在幾十毫秒的時間內切換當前線程的執行。在多處理器計算機上,"thread scheduler"一方面也會扮演在單處理器上的角色,此外,還會同時把不同的線程交給不同的CPU處理。值得注意的是:使用多線程并不是總是好的。□ 線程和進程
一臺運行的電腦上可能會有多個進程,一個運行的進程可能會有多個線程。進程之間是完全隔離的,但在同一應用程序中不同線程可以共享數據。線程之間可以協同工作,比如一個后臺線程用來獲取數據,當獲取到數據之后,另一個線程用來顯示數據。
□ 多線程的應用場景
○ 保持一個更快響應的UI界面:讓UI線程只處理鼠標和鍵盤觸發事件,其它線程處理其它事件。○ 有效利用CPU:一個線程被阻塞,該線程就不會占有CPU資源。○ 并行編程:執行一個比較耗時的任務時,可以分攤給多個線程。○ 投機執行:讓一個有可能被執行的線程先提前執行;讓不同的線程用不同的算法,最先得出結果的勝出。○ 請求被同步處理:無論是在客戶端還是在服務端,可以用多線程同時處理多個并發請求。
□ 創建第一個線程
using System;using System.Threading;namespace Consoleapplication4{class PRogram{static void Main(string[] args){var thread = new Thread(DoSth);thread.Start();}static void DoSth(){Console.WriteLine("我來自另外一個線程");}}}
實際上,new Thread(ThreadStart del)中的形參是委托類型:
public delegate void ThreadStart();
既然是委托,那在聲明委托的時候,同樣可以使用委托的構造函數:
var thread = new Thread(new ThreadStart (DoSth))
如果DoSth方法帶參數,可以這樣寫:
var thread = new Thread(new ParameterizedThreadStart(DoSth));
□ 前臺線程和后臺線程
新建的線程在默認情況下是前臺線程,可以通過把IsBackground屬性設置為true,把線程定義為后臺線程,一旦定義成后臺線程,只要前臺線程結束,無論后臺線程是否結束,應用程序進程結束。
using System;using System.Threading;namespace ConsoleApplication4{class Program
新聞熱點
疑難解答