.NET跨線程控件的相關操作是什么

.NET跨線程控件的相關操作是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

專注于為中小企業提供成都網站建設、網站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業新余免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了近千家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。

在.NET中,如果我們在非UI線程上訪問窗體上的控件的時候,會產生一個跨線程調用的異常,那么如何處理這種情況呢?我介紹了使用Control.Invoke方法,如果你不習慣使用委托,那么.Net還為我們提供了一個組件BackgroundWorker,你可以使用這個組件,以事件的方式去處理這種跨線程的控件訪問。下面我就來詳細的介紹一下這個組件的用法。

我們先來看一下BackgroundWorker提供了哪些常用的成員,

事件

◆DoWork:我們在這個事件中,執行需要異步處理的工作。

◆ProgressChanged:我們在這個事件中,接收并處理異步處理過程中的信息。

◆RunWorkerCompleted:我們在這個事件中,執行異步處理結束的工作。

方法

◆RunWorkerAsync()和RunWorkerAsync(object argument):這兩個方法觸發DoWork事件,開始異步操作。

◆ReportProgress(int percentProgress)和ReportProgress(int percentProgress, object userState):這兩個方法觸發ProgressChanged事件。

◆CancelAsync:結束后臺的異步操作。

屬性

◆bool CancellationPending:指示當前的后臺的異步操作是否正在被取消,執行CancelAsync方法會導致這個屬性為true。

◆bool IsBusy:指示當前的后臺異步操作是否正在進行,進行中為true。

◆bool WorkerReportsProgress:獲取或設置當前的BackgroundWorker是否可以執行ProgressChanged方法。

◆bool WorkerSupportsCancellation:獲取或設置當前的BackgroundWorker是否可以執行CancelAsync方法。

OK,有了上面這些成員,我們來看一下BackgroundWorker是如何工作的。

Step 1. 當然是定義一個BackgroundWorker的實例,你可以從工具箱中拖拽一個BackgroundWorker控件到窗體上或者在代碼中直接聲明;

Step 2. 生成DoWork事件并在DoWork事件的中添加需要異步執行的代碼。在異步執行的代碼中,如果需要處理界面中的控件,請調用ReportProgress方法,而不要直接處理(例如給控件賦值),因為DoWork事件跟正常的界面的事件不同,這個事件在非UI線程上執行,所以才能異步執行。

Step 3. 生成ProgressChanged事件并添加控件處理的代碼,因為這個事件是在UI線程上執行的,所以可以給界面中的控件進行賦值等操作。

Step 4. 如果需要,請生成RunWorkerCompleted事件,在此處理異步執行結束的業務邏輯。當然,此事件也是在UI線程上執行的,可以給界面中的控件進行賦值等操作。

Step 5. 在需要執行異步操作的地方調用RunWorkerAsync方法,開始執行異步調用。

下面是具體的代碼:

public Form1()      {        InitializeComponent();         bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);         bWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bWorker_RunWorkerCompleted);        bWorker.ProgressChanged += new ProgressChangedEventHandler(bWorker_ProgressChanged);        this.Text = "UI thread id is:" + Thread.CurrentThread.ManagedThreadId.ToString();      }     BackgroundWorker bWorker = new BackgroundWorker();    void bWorker_DoWork(object sender, DoWorkEventArgs e)     {     int tick = (int)e.Argument;      Thread thr = Thread.CurrentThread;     for (int i = 0; i < 30; i++)      {        if (bWorker.CancellationPending)         {            e.Cancel = true;              //break;       }     else        {               Thread.Sleep(TimeSpan.FromSeconds(tick));              bWorker.ReportProgress(i, DateTime.Now.ToString() + "\\TID:" + thr.ManagedThreadId.ToString());          }        }            }   void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)     {    progressBar1.Value = e.ProgressPercentage;       label1.Text = e.UserState.ToString();    }    void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)   {     label1.Text = DateTime.Now.ToString();        progressBar1.Value = progressBar1.Maximum;         if (e.Cancelled)     label1.Text = "User cancelled.";    }    private void btnInvoke_Click(object sender, EventArgs e)   {     bWorker.WorkerReportsProgress = true;       bWorker.WorkerSupportsCancellation = true;        if (!bWorker.IsBusy)        bWorker.RunWorkerAsync(1);    }   private void btnCancel_Click(object sender, EventArgs e)     {        if (bWorker.WorkerSupportsCancellation)           bWorker.CancelAsync();    }

上面的代碼請注意幾個地方:

1. 第50行,開始調用RunWorkerAsync方法前,請先判斷IsBusy屬性是否是false,因為如果為true,則說明上一次的調用還沒有結束,再次調用會引發異常。

2. 第56行,調用CancelAsync方法前,請先設置WorkerSupportsCancellation屬性為true,否則會引發異常。

3. 第26行,調用ReportProgress方法前,請先設置WorkerReportsProgress屬性為true,否則會引發異常。

4. RunWorkerAsync方法傳遞的參數是object類型,這個參數的值可以在DoWork事件的參數e中的屬性Argument獲得。

5. ReportProgress方法傳遞的參數可以在事件ProgressChanged中的參數e中獲得。

6. 調用CancelAsync方法只是向后臺的異步線程發出結束申請,具體什么時候結束,由線程自動管理。

7. 在RunWorkerCompleted事件中,如果想知道后臺任務是正常執行完畢還是被調用CancelAsync方法強制中斷,請參考事件的參數e的Cancelled屬性。(奇怪的是這個屬性不會在你調用CancelAsync方法后自動設置為true,你需要象代碼中的20行那樣進行設置。)

8. 請注意第7行和第26行的代碼,這兩段代碼中的線程的ID,說明了DoWork事件和UI是在兩個不同的線程上執行。

實際上BackgroundWorker并非直接用來解決跨線程的控件調用的問題,只是它提供了一種工作機制,可以讓你的程序利用它來執行異步調用,并且在異步調用的過程中進行控件的操作。

關于.NET跨線程控件的相關操作是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創新互聯行業資訊頻道了解更多相關知識。

當前標題:.NET跨線程控件的相關操作是什么
當前路徑:http://m.kartarina.com/article28/jedhjp.html

成都網站建設公司_創新互聯,為您提供品牌網站建設自適應網站微信公眾號ChatGPT做網站網站營銷

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 亚洲AV无码XXX麻豆艾秋| 2020无码专区人妻系列日韩| 人妻丰满?V无码久久不卡| 无码人妻久久一区二区三区蜜桃| 国产精品无码专区AV在线播放| 丝袜无码一区二区三区| 亚洲av无码专区在线观看亚| 无码A级毛片日韩精品| 精品人妻大屁股白浆无码| 八戒理论片午影院无码爱恋| 国产高清不卡无码视频| 国产成人无码精品一区二区三区| 中文字幕乱妇无码AV在线| 亚洲精品无码av人在线观看| 一本加勒比HEZYO无码人妻| 日本无码WWW在线视频观看| 无码专区人妻系列日韩精品少妇| 亚洲高清无码综合性爱视频| 亚洲一区无码中文字幕| 国产品无码一区二区三区在线| 国产久热精品无码激情| 无码专区—VA亚洲V天堂| 久久久久久精品无码人妻| 超清无码一区二区三区| 内射中出无码护士在线| 人妻aⅴ中文字幕无码| 亚洲日韩av无码中文| 久久久g0g0午夜无码精品 | 日日摸日日碰人妻无码| 无码免费一区二区三区免费播放| 国产网红无码精品视频| 国产午夜无码片免费| 国产强被迫伦姧在线观看无码| 人禽无码视频在线观看| 亚洲av永久无码精品秋霞电影秋| 无码h黄动漫在线播放网站| 亚洲大尺度无码无码专区| 亚洲精品中文字幕无码蜜桃| 亚洲日韩精品无码专区网站| 精品无码国产自产拍在线观看蜜| 无码人妻精品一区二区三区99仓本 |