小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#通過接口與線程通信(捕獲線程狀態(tài))介紹

 昵稱10504424 2013-11-18

摘要:本文介紹C#通過接口與線程通信(捕獲線程狀態(tài)),并提供簡單的示例代碼供參考。

提示:本文所提到的線程狀態(tài)變化,并不是指線程啟動、暫停、停止,而是說線程內(nèi)部狀態(tài)的遷移。隨著軟件技術(shù)不斷發(fā)展,用戶需求不斷提升,多線程的重要性日益凸顯。

關(guān)于線程,通俗的講,每當啟動一個exe應用程序,都會創(chuàng)建一個進程和一個主線程,主線程用來處理界面繪制、界面事件響應等工作,而進程則是線程的容器,主線程和用戶創(chuàng)建的新線程,都將在相應的進程中維護。由此可知,一個程序之所以能工作,是線程的功勞,進程僅僅是容器而已,一旦程序的主線程被阻塞,就會造成界面無響應等現(xiàn)象,這時候就要用多線程解決問題。然而,在程序中使用多線程,是比較頭疼的一件事。以我的體會,多線程首先會造成程序不穩(wěn)定,處理不好容易導致程序崩潰。其次,多線程控制并不是那么容易,比如線程狀態(tài)監(jiān)控、線程訪問沖突等等。最后,還有一個線程通信問題,線程和線程之間的數(shù)據(jù)交互、消息通知等,并不是那么容易,往往涉及高級知識,比如委托。很多情況下,我們希望能獲得線程的“返回值”,也就是能夠獲得線程中的數(shù)據(jù),當線程內(nèi)部狀態(tài)發(fā)生改變時,我們能及時獲取關(guān)鍵數(shù)據(jù),來進行不同的處理。遺憾的是,線程是沒有返回值的,在線程中運行的方法,返回值必須是void,但可以有參數(shù)。本文就從這個角度出發(fā),通過一個簡單的小技巧,及時捕獲線程狀態(tài)變化,并且獲得關(guān)鍵數(shù)據(jù)。

思路如下圖:

簡單的解釋一下,核心思想:通過定義接口,來規(guī)范線程參數(shù),當線程內(nèi)部狀態(tài)遷移時,調(diào)用接口中定義的對應處理方法,達到捕獲線程狀態(tài)的目的,同時也能獲得線程內(nèi)部關(guān)鍵數(shù)據(jù)。

代碼實現(xiàn)如下:

winform窗體中的代碼(對應線程相關(guān)類):

復制代碼
using System.Threading;

 ///羅旭成
///2013-11-14
/// <summary> /// 響應開始按鈕單擊事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { //實例化ThreadNotice類對象,ThreadNotice類實現(xiàn)了IThreadNotice接口 IThreadNotice tn = new ThreadNotice(); //實例化一個Thread對象,并且指定該Thread對象執(zhí)行Run方法 Thread th = new Thread(Run); //啟動線程,并且傳入線程方法(Run)需要的一個參數(shù) //注意,這里最多能傳入一個參數(shù)!!并且要求線程方法的參數(shù)為Object類型??! th.Start(tn); } //線程中運行的方法 void Run(Object obj) { //將對象轉(zhuǎn)換成接口類型 IThreadNotice tn = (IThreadNotice)obj; //假設(shè)狀態(tài)為1,則調(diào)用實現(xiàn)IThreadNotice接口類的狀態(tài)1處理方法,并傳入狀態(tài)1下的數(shù)據(jù) tn.ThreadEvent1("狀態(tài)1"); //假設(shè)為狀態(tài)2,則調(diào)用實現(xiàn)IThreadNotice接口類的狀態(tài)2處理方法,并傳入狀態(tài)2下的數(shù)據(jù) tn.ThreadEvent2("狀態(tài)2"); }
復制代碼

線程狀態(tài)處理接口:

復制代碼
///羅旭成
///2013-11-14
//
線程狀態(tài)通知接口 public interface IThreadNotice { //狀態(tài)1處理方法 void ThreadEvent1(string msg); //狀態(tài)2處理方法 void ThreadEvent2(string msg); }
復制代碼

狀態(tài)處理類:

復制代碼
using System.Diagnostics;

///羅旭成
///2013-11-14
//ThreadNotice類實現(xiàn)了IThreadNotice接口 public class ThreadNotice:IThreadNotice { //ThreadNotice類對于狀態(tài)1的處理 public void ThreadEvent1(string msg) { Debug.WriteLine("ThreadNotice類處理——" + msg); } //ThreadNotice類對于狀態(tài)2的處理 public void ThreadEvent2(string msg) { Debug.WriteLine("ThreadNotice類處理——" + msg); } }
復制代碼

效果圖:

相信大家已經(jīng)看出,此方法只能達到捕獲、處理線程狀態(tài)的效果,并不能把線程中的數(shù)據(jù)返回。也就是說,雖然我們捕獲了線程狀態(tài),獲取了關(guān)鍵數(shù)據(jù),但這仍然是一種向下的深層調(diào)用,并沒有向上層返回。比如,做不到把線程中的數(shù)據(jù)顯示在界面上,那將用到委托技術(shù)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多