.NET線程控制

線程:

操作系統使用進程將正在執行的不同應用程序分開。線程是操作系統分配處理器時間的基本單元,並且該進程中可以有多個線程同時執行代碼。每個線程都維護異常處理程序、調度優先級和一組系統用於在調度該線程前保存線程上下文的結構。線程上下文包括使線程在線程的宿主進程地址空間中無縫地繼續執行所需要的所有信息,包括線程的CPU寄存器組合和堆棧。

1)創建線程,使用System.Threading下的Thread類:

Thread thread=new Thread(new ThreadStart(FunctionName));

//線程處理函數

Private void FunctionName()

{}

2)線程啓動,使用Thread類的Start方法(方法無參數也無返回值):

//FunctionName爲線程處理函數

Thread thread=new Thread(news ThreadStart(FunctionName));

//啓動線程

thread.Start();

3)線程暫停與重新啓動

線程重新啓動後,可以調用Thread.Sleep使當前線程立即阻塞一段時間(參數單位爲毫秒),調用Thread.Sleep(Timeout.Infinite)將使線程休眠,直到它被另一個進程調用Thread.Interrupt中斷或被Thread.Abort中止爲止。注意,一個線程不能對另一個線程調用Sleep.

eg:Thread.Sleep(2000);//使當前線程阻塞2秒

可以通過調用Thread.Suspend來暫停一個線程。當線程自己調用Thread.Suspend時,該調用將阻塞,直到該線程被另一個線程繼續爲止。當一個線程對另一個線程調用Thread.Suspend時,該調用就成爲使另一個線程暫停的非阻塞調用(把一個線程阻塞,自己運行)。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Suspend();//自調用阻塞

調用Thread.Resume將一個線程跳出掛起狀態並使該進程繼續執行,而與調用Thread.Suspend的次數無關。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

...

thread.Suspend();

thread.Suspend();

//調用Thread.Suspend的2次,但只要調用thread.Resume()線程就繼續執行

...

thread.Resume();

通過調用Thread.Join將本線程阻塞直至另一線程終止時再執行)。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Join(1000);

經典例子:

        static void Main()

        {

            System.Threading.Thread x = new System.Threading.Thread(new System.Threading.ThreadStart(f1));

            x.Start();

            Console.WriteLine("This is Main.{0}", 1);

            x.Join();//停止前執行線程處理函數f1

            Console.WriteLine("This is Main.{0}", 2);

            Console.ReadLine();

        }

        static void f1()

        {

            System.Threading.Thread y = new System.Threading.Thread(new System.Threading.ThreadStart(f2));

            y.Start();

            y.Join();

            Console.WriteLine("This is F1.{0}",1);

        }

 

        static void f2()

        {

            Console.WriteLine("This is F2.{0}", 1);

        }

輸出:

This is Main.1

This is F2.1

This is F1.1

This is Main.2

 

如果: 註釋//  x.Join();

結果:

This is Main.1

This is Main.2

This is F2.1

This is F1.1

 

4)線程銷燬

線程佔用大量的系統資源,使用完後必須使用Thread.Abort和Thread.Interrupt方法銷燬。

在主線程調用子線程的Thread.Abort後,會在子線程中拋出一個ThreadAbortException異常,可以在子線程中使用try...catch捕獲該異常,並進行相應的處理。但,如果在調用Thread.Abort之前,子線程已經結束,則不出現異常。反之,子線程還未結束則出現異常。

線程不一定會立即中止,或者根本不中止。如果線程在作爲中止過程的一部分被調用的 finally 塊中做非常大量的計算,從而無限期延遲中止操作,則會發生這種情況。若要在線程中止之前一直等待,可以在調用 Abort 方法後對該線程調用 Join 方法,但是不能保證等待會結束。

如果對尚未啓動的線程調用 Abort,則當調用 Start 時該線程將中止,拋出異常提示“線程正在運行或被終止;它無法重新啓動。”。如果對被阻止或正在休眠的線程調用 Abort,則該線程被中斷然後中止。

如果在已掛起的線程上調用 Abort,則將在調用 Abort 的線程中引發 ThreadStateException,並將 AbortRequested 添加到被中止的線程的 ThreadState 屬性中。直到調用 Resume 後,纔在掛起的線程中引發 ThreadAbortException。

如果在執行非託管代碼時線程忽略 ThreadAbortException,則當線程開始執行託管代碼時,系統將再次引發 ThreadAbortException。

如果同時出現兩次對 Abort 的調用,則可能一個調用設置狀態信息,而另一個調用執行 Abort。但是,應用程序無法區分這一點。

對線程調用了 Abort 後,線程狀態包括 AbortRequested。成功調用 Abort 而使線程終止後,線程狀態更改爲 Stopped。如果有足夠的權限,作爲 Abort 目標的線程就可以使用 ResetAbort 方法取消中止操作。有關說明如何調用 ResetAbort 方法的示例,請參見 ThreadAbortException 類。

Thread.Interrupt方法用於中斷處於Wait、Sleep、Join線程狀態的線程。如果線程當前未阻塞,在等待、休眠或連接狀態中,則下次開始阻塞時它將被中斷。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Join(10000);

thread.Interrupt();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章