欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#通過(guò)接口與線程通信(捕獲線程狀態(tài))示例代碼

 更新時(shí)間:2013年12月02日 11:05:08   作者:  
本文介紹C#通過(guò)接口與線程通信(捕獲線程狀態(tài)),并提供簡(jiǎn)單的示例代碼供參考

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

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

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

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

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

復(fù)制代碼 代碼如下:

using System.Threading;

 ///羅旭成
 ///2013-11-14
 /// <summary>

 /// 響應(yīng)開始按鈕單擊事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnStart_Click(object sender, EventArgs e)
 {
     //實(shí)例化ThreadNotice類對(duì)象,ThreadNotice類實(shí)現(xiàn)了IThreadNotice接口
     IThreadNotice tn = new ThreadNotice();
     //實(shí)例化一個(gè)Thread對(duì)象,并且指定該Thread對(duì)象執(zhí)行Run方法
     Thread th = new Thread(Run);
     //啟動(dòng)線程,并且傳入線程方法(Run)需要的一個(gè)參數(shù)
     //注意,這里最多能傳入一個(gè)參數(shù)??!并且要求線程方法的參數(shù)為Object類型!!
     th.Start(tn);
 }

 //線程中運(yùn)行的方法
 void Run(Object obj)
 {
     //將對(duì)象轉(zhuǎn)換成接口類型
     IThreadNotice tn = (IThreadNotice)obj;
     //假設(shè)狀態(tài)為1,則調(diào)用實(shí)現(xiàn)IThreadNotice接口類的狀態(tài)1處理方法,并傳入狀態(tài)1下的數(shù)據(jù)
    tn.ThreadEvent1("狀態(tài)1");
     //假設(shè)為狀態(tài)2,則調(diào)用實(shí)現(xiàn)IThreadNotice接口類的狀態(tài)2處理方法,并傳入狀態(tài)2下的數(shù)據(jù)
     tn.ThreadEvent2("狀態(tài)2");
 }

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

復(fù)制代碼 代碼如下:

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

狀態(tài)處理類:

復(fù)制代碼 代碼如下:

using System.Diagnostics;

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


     //ThreadNotice類對(duì)于狀態(tài)2的處理
     public void ThreadEvent2(string msg)
     {
         Debug.WriteLine("ThreadNotice類處理——" + msg);
     }
 }



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

相關(guān)文章

  • C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例

    C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝示例

    這篇文章主要介紹了C#實(shí)現(xiàn)的微信網(wǎng)頁(yè)授權(quán)操作邏輯封裝,分析了微信網(wǎng)頁(yè)授權(quán)操作的原理、步驟并給出了C#實(shí)現(xiàn)的網(wǎng)頁(yè)授權(quán)操作邏輯封裝類,需要的朋友可以參考下
    2016-10-10
  • Unity使用LineRender實(shí)現(xiàn)簽名效果

    Unity使用LineRender實(shí)現(xiàn)簽名效果

    這篇文章主要為大家詳細(xì)介紹了Unity使用LineRender實(shí)現(xiàn)簽名效果,制作簽名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c#中String類型的存儲(chǔ)原理詳解

    c#中String類型的存儲(chǔ)原理詳解

    本文主要介紹了c#中String類型的存儲(chǔ)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C# Cache緩存讀取的設(shè)置方法

    C# Cache緩存讀取的設(shè)置方法

    這篇文章主要介紹了C# Cache緩存讀取的設(shè)置方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • Unity動(dòng)畫混合樹實(shí)例詳解

    Unity動(dòng)畫混合樹實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Unity動(dòng)畫混合樹實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#連接數(shù)據(jù)庫(kù)的方法

    C#連接數(shù)據(jù)庫(kù)的方法

    ASP.NET連接數(shù)據(jù)庫(kù)的技術(shù)叫ADO.NET,它是用來(lái)向數(shù)據(jù)庫(kù)提交sql語(yǔ)句的一堆類。這里連接的是Sql Server 2008數(shù)據(jù)庫(kù),其他數(shù)據(jù)庫(kù)用法差不多,就是調(diào)用的類名不一樣
    2015-11-11
  • c# 實(shí)現(xiàn)簡(jiǎn)單的串口通訊

    c# 實(shí)現(xiàn)簡(jiǎn)單的串口通訊

    這篇文章主要介紹了c# 如何實(shí)現(xiàn)簡(jiǎn)單的串口通訊,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則

    C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則

    這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C# 得到某一天的起始和截止時(shí)間的代碼

    C# 得到某一天的起始和截止時(shí)間的代碼

    自己的制作的單詞學(xué)習(xí)程序中需要得到某一天的起始和截止時(shí)間,找了一下,使用一個(gè)字符串來(lái)轉(zhuǎn)換比較方便
    2011-11-11
  • 詳解C# 不能用于文件名的字符

    詳解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作為文件名,嘗試重命名一個(gè)文件,輸入/ 就可以看到windows 提示的不能作為文件名的字符,那么具體是包括哪些符號(hào)不能作為文件名呢?下面小編給大家介紹下
    2018-02-02

最新評(píng)論