C#非同步編程的實現方式(2)——Thread類

來源:互聯網
上載者:User

.Net Framework提供了Thread類,它可以建立和控制線程。Thread的構造方法可接受一個無參無傳回值的委託型別參數,或一個有object型別參數無傳回值的委託型別參數。

 

 

 

 

1、簡單的Thread類執行個體

先建立兩個方法,分別用於兩個線程處理:

   1: static void ThreadMethod1()
   2: {
   3:     for (int j = 0; j < 20; j++)
   4:     {
   5:         Console.WriteLine("Thread 1 is running");
   6:         Thread.Sleep(500);
   7:     }
   8: }
   9:  
  10: static void ThreadMethod2()
  11: {
  12:     for (int j = 0; j < 20; j++)
  13:     {
  14:         Console.WriteLine("Thread 2 is running");
  15:         Thread.Sleep(500);
  16:     }
  17: }

兩個線程將都是迴圈20次,每隔500ms輸出字串到控制台。然後在主線程裡啟動這兩個線程:

   1: static void Main(string[] args)
   2: {
   3:     Thread thread1 = new Thread(ThreadMethod1);
   4:     Thread thread2 = new Thread(ThreadMethod2);
   5:  
   6:     thread1.Start();
   7:     thread2.Start();
   8:  
   9:     Console.Read();
  10: }

可以看到結果是"Thread 1 is running"和"Thread 2 is running"出現,但可能不完全是交替出現,因為兩個線程是同時在走,某一個時間點上哪個線程到前台是由作業系統調度的。

 

 

2、線程資料傳遞

往線程裡傳遞資料有兩種方式。

 

(1)ParameterizedThreadStart委託參數

如果使用ParameterizedThreadStart委託,線程的入口必須有一個object型別參數。這個參數線上程內可以強制轉換為任意資料類型。

先定義一個結構作為輸入參數的類型:

   1: struct ThreadData
   2: {
   3:     public string Message;
   4: }

定義一個方法,線上程裡調用:

   1: static void ThreadMethod3(object param)
   2: {
   3:     ThreadData data = (ThreadData)param;
   4:  
   5:     for (int i = 0; i < 20; i++)
   6:     {
   7:         Console.WriteLine(String.Format("Thread 3 is running. Message: {0}", data.Message));
   8:     }
   9: }

方法裡把輸入的參數強制轉成了ThreadData類型。

然後在主線程裡啟動這個線程,用Start方法傳入資料:

   1: Thread thread3 = new Thread(ThreadMethod3);
   2: thread3.Start(new ThreadData() { Message = "Hello world!" });

從結果就可以看到“Hello World!”傳入了線程。

 

 

(2)執行個體方法 
用上一個例子,定義一個類,其中包含一個資料欄位和線程方法:

   1: class Thread4Class
   2: {
   3:     public string Message { get; set; }
   4:  
   5:     public void ThreadMethod4()
   6:     {
   7:         for (int i = 0; i < 20; i++)
   8:         {
   9:             Console.WriteLine(String.Format("Thread 4 is running. Message: {0}", Message));
  10:             Thread.Sleep(500);
  11:         }
  12:     }
  13: }

然後在主線程裡啟動:

   1: Thread4Class thread4Class = new Thread4Class() { Message = "Hello world!" };
   2: Thread thread4 = new Thread(thread4Class.ThreadMethod4);
   3: thread4.Start();

這種方法可以在對線程操作有封裝要求的情況下使用。

 

 

3、前台線程與後台線程

只要有一個前台線程在運行,應用程式的進程就在運行。如果有多個前台線程在運行,儘管Main方法結束了,應用程式進程仍然是啟用的,直到所有前台線程結束。最後一個前台線程結束會使所有後台線程一起結束,並且應用程式進程結束。在預設情況下,Thread執行個體是前台進程,除非在建立Thread執行個體時設定IsBackground屬性為true。

 

 

4、優先順序

前面提到線程的調度由作業系統控制,Thread.Priority屬性可以影響調度的順序。需要注意的是,給線程指定Priority會降低其它線程的運行機率,最好是根據需要,短暫改變優先順序。

 

Thread類有用法就簡要介紹到這,更多關於Thread類的資訊,請參閱MSDN。

 

 

參考資料:《C#進階編程》

http://www.cnblogs.com/sosowjb/archive/2012/08/11/2633230.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.