C#通過介面與線程通訊(捕獲線程狀態)

來源:互聯網
上載者:User

         提示:本文所提到的線程狀態變化,並不是指線程啟動、暫停、停止,而是說線程內部狀態的遷移。

        

         隨著軟體技術不斷髮展,使用者需求不斷提升,多線程的重要性日益凸顯。

         關於線程,通俗的講,每當啟動一個exe應用程式,都會建立一個進程和一個主線程,主線程用來處理介面繪製、介面事件響應等工作,而進程則是線程的容器,主線程和使用者建立的新線程,都將在相應的進程中維護。

         由此可知,一個程式之所以能工作,是線程的功勞,進程僅僅是容器而已,一旦程式的主線程被阻塞,就會造成介面無響應等現象,這時候就要用多線程解決問題。

         然而,在程式中使用多線程,是比較頭疼的一件事。以我的體會,多線程首先會造成程式不穩定,處理不好容易導致程式崩潰。其次,多線程式控制制並不是那麼容易,比如線程狀態監控、線程存取違規等等。最後,還有一個線程通訊問題,線程和線程之間的資料互動、訊息通知等,並不是那麼容易,往往涉及進階知識,比如委託。

         很多情況下,我們希望能獲得線程的“傳回值”,也就是能夠獲得線程中的資料,當線程內部狀態發生改變時,我們能及時擷取關鍵資料,來進行不同的處理。

         遺憾的是,線程是沒有傳回值的,線上程中啟動並執行方法,傳回值必須是void,但可以有參數。

         本文就從這個角度出發,通過一個簡單的小技巧,及時捕獲線程狀態變化,並且獲得關鍵資料。

         思路如:

         簡單的解釋一下,核心思想:通過定義介面,來規範線程參數,當線程內部狀態遷移時,調用介面中定義的對應處理方法,達到捕獲線程狀態的目的,同時也能獲得線程內部關鍵資料。

 

         代碼實現如下:

 

         winform表單中的代碼(對應線程相關類):

 1 using System.Threading; 2  3 /// <summary> 4 /// 響應開始按鈕單擊事件 5 /// </summary> 6 /// <param name="sender"></param> 7 /// <param name="e"></param> 8 private void btnStart_Click(object sender, EventArgs e) 9 {10     //執行個體化ThreadNotice類對象,ThreadNotice類實現了IThreadNotice介面11     IThreadNotice tn = new ThreadNotice();12     //執行個體化一個Thread對象,並且指定該Thread對象執行Run方法13     Thread th = new Thread(Run);14     //啟動線程,並且傳入線程方法(Run)需要的一個參數15     //注意,這裡最多能傳入一個參數!!並且要求線程方法的參數為Object類型!!16     th.Start(tn);17 }18 19 //線程中啟動並執行方法20 void Run(Object obj) 21 {22     //將對象轉換成介面類型23     IThreadNotice tn = (IThreadNotice)obj;24     //假設狀態為1,則調用實現IThreadNotice介面類的狀態1處理方法,並傳入狀態1下的資料25     tn.ThreadEvent1("狀態1");26     //假設為狀態2,則調用實現IThreadNotice介面類的狀態2處理方法,並傳入狀態2下的資料27     tn.ThreadEvent2("狀態2");28 }

         線程狀態處理介面:

1 //線程狀態通知介面2 public interface IThreadNotice3 {4     //狀態1處理方法5     void ThreadEvent1(string msg);6     //狀態2處理方法7     void ThreadEvent2(string msg);8 }

         狀態處理類:

 1 using System.Diagnostics; 2  3 //ThreadNotice類實現了IThreadNotice介面 4 public class ThreadNotice:IThreadNotice 5 { 6     //ThreadNotice類對於狀態1的處理 7     public void ThreadEvent1(string msg) 8     { 9         Debug.WriteLine("ThreadNotice類處理——" + msg);10     }11 12     //ThreadNotice類對於狀態2的處理13     public void ThreadEvent2(string msg)14     {15         Debug.WriteLine("ThreadNotice類處理——" + msg);16     }17 }

        

 

         相信讀者已經看出,此方法只能達到捕獲、處理線程狀態的效果,並不能把線程中的資料返回。也就是說,雖然我們捕獲了線程狀態,擷取了關鍵資料,但這仍然是一種向下的深層調用,並沒有向上層返回。比如,做不到把線程中的資料顯示在介面上,那將用到委託技術。

         此文僅僅是個人實際使用心得,合理性、實用性等均有待考證,僅供參考!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.