日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#通过接口与线程通信(捕获线程状态)介绍

發布時間:2023/11/30 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#通过接口与线程通信(捕获线程状态)介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

關于線程,通俗的講,每當啟動一個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);}}

效果圖:

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

?

轉載于:https://www.cnblogs.com/jara/p/3424150.html

總結

以上是生活随笔為你收集整理的C#通过接口与线程通信(捕获线程状态)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。