a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

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

2020-01-24 03:02:28
字體:
來源:轉載
供稿:網友

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

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

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

代碼實現如下:

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

復制代碼 代碼如下:

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類實現了IThreadNotice接口
     IThreadNotice tn = new ThreadNotice();
     //實例化一個Thread對象,并且指定該Thread對象執行Run方法
     Thread th = new Thread(Run);
     //啟動線程,并且傳入線程方法(Run)需要的一個參數
     //注意,這里最多能傳入一個參數!!并且要求線程方法的參數為Object類型!!
     th.Start(tn);
 }

 //線程中運行的方法
 void Run(Object obj)
 {
     //將對象轉換成接口類型
     IThreadNotice tn = (IThreadNotice)obj;
     //假設狀態為1,則調用實現IThreadNotice接口類的狀態1處理方法,并傳入狀態1下的數據
    tn.ThreadEvent1("狀態1");
     //假設為狀態2,則調用實現IThreadNotice接口類的狀態2處理方法,并傳入狀態2下的數據
     tn.ThreadEvent2("狀態2");
 }

線程狀態處理接口:

復制代碼 代碼如下:

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

狀態處理類:

復制代碼 代碼如下:

using System.Diagnostics;

///羅旭成
///2013-11-14
//ThreadNotice類實現了IThreadNotice接口
 public class ThreadNotice:IThreadNotice
 {
     //ThreadNotice類對于狀態1的處理
     public void ThreadEvent1(string msg)
    {
         Debug.WriteLine("ThreadNotice類處理――" + msg);
     }


     //ThreadNotice類對于狀態2的處理
     public void ThreadEvent2(string msg)
     {
         Debug.WriteLine("ThreadNotice類處理――" + msg);
     }
 }



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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久精品成人av | 男人天堂社区 | 国产乱精品一区二区三区 | 国产成人精品大尺度在线观看 | 91久久国产综合久久蜜月精品 | 一区二区三区在线观看视频 | 国产一区二区三区久久 | 久草资源在线视频 | 在线免费看a | 毛片一区 | 日韩精品一区二区三区中文在线 | 色欧美综合 | 六月丁香av | 成人99| 久久精品久久久 | 国产精品99精品久久免费 | 午夜剧场av | 性视频一区二区 | www一区二区 | 亚洲怡红院在线观看 | 欧美日韩中文在线 | 久久99深爱久久99精品 | 蜜桃免费一区二区三区 | 午夜激情视频免费 | 成人av片在线观看 | 久久人| 成年人在线观看视频 | 福利一区福利二区 | 国产精品一区在线观看 | 日韩精品一区二区三区在线观看 | 欧美一区2区三区4区公司二百 | 国产精品久久久久毛片软件 | 91av国产在线视频 | 久久久久久久影院 | 国产高清视频 | 精品一区二区不卡 | 精品一区二区三区久久久 | 91亚洲视频| 免费毛片a线观看 | 国产精品一区久久久久 | 久久久www成人免费精品 |