成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 后端
本文將為大家介紹一下.NET跨線程控件的相關操作,有時可能會出現(xiàn)一種跨線程調用的異常,這里也包括相關的解決方案。

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

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

事件

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

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

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

方法

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

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

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

屬性

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

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

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

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

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

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

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

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

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

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

下面是具體的代碼:

  1. public Form1()     
  2.  {     
  3.    InitializeComponent();    
  4.      bWorker.DoWork += new DoWorkEventHandler(bWorker_DoWork);    
  5.      bWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bWorker_RunWorkerCompleted);   
  6.      bWorker.ProgressChanged += new ProgressChangedEventHandler(bWorker_ProgressChanged);     
  7.    this.Text = "UI thread id is:" + Thread.CurrentThread.ManagedThreadId.ToString();     
  8.  }     
  9. BackgroundWorker bWorker = new BackgroundWorker();    
  10. void bWorker_DoWork(object sender, DoWorkEventArgs e)    
  11.  {    
  12.  int tick = (int)e.Argument;    
  13.   Thread thr = Thread.CurrentThread;    
  14.  for (int i = 0; i < 30; i++)    
  15.   {    
  16.     if (bWorker.CancellationPending)    
  17.      {    
  18.         e.Cancel = true;    
  19.           //break;    
  20.    }    
  21.  else    
  22.     {    
  23.            Thread.Sleep(TimeSpan.FromSeconds(tick));    
  24.           bWorker.ReportProgress(i, DateTime.Now.ToString() + "\\TID:" + thr.ManagedThreadId.ToString());    
  25.       }    
  26.     }    
  27.        
  28.  }   
  29. void bWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)    
  30.  {    
  31. progressBar1.Value = e.ProgressPercentage;  
  32.      label1.Text = e.UserState.ToString();   
  33.  }    
  34. void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  
  35.  {    
  36.  label1.Text = DateTime.Now.ToString();   
  37.      progressBar1.Value = progressBar1.Maximum;    
  38.      if (e.Cancelled)    
  39.  label1.Text = "User cancelled.";    
  40. }    
  41. private void btnInvoke_Click(object sender, EventArgs e)   
  42. {   
  43.   bWorker.WorkerReportsProgress = true;   
  44.     bWorker.WorkerSupportsCancellation = true;    
  45.     if (!bWorker.IsBusy)   
  46.      bWorker.RunWorkerAsync(1);    
  47. }   
  48. private void btnCancel_Click(object sender, EventArgs e)    
  49.  {    
  50.     if (bWorker.WorkerSupportsCancellation)   
  51.         bWorker.CancelAsync();    

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

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

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

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

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

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

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

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

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

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

好了,關于如何對界面中的控件進行跨線程的調用就介紹這么多吧,希望對大家有所幫助。

原文標題: 在.Net中進行跨線程的控件操作(下篇:BackgroundWorker)

鏈接:http://www.cnblogs.com/happinessCodes/archive/2010/07/22/1783199.html

【編輯推薦】

  1. .NET上執(zhí)行多線程應該注意的兩點
  2. C#多線程控制進度條之多線程安全
  3. 通過多線程為基于.NET的應用程序實現(xiàn)響應迅速
  4. .NET 4.0中任務與線程關系談
  5. 在.NET多線程程序中使用異步調用的簡易方法
責任編輯:彭凡 來源: 博客園
相關推薦

2024-05-16 12:51:15

WinForms線程UI

2009-07-24 10:36:08

ASP.NET控件

2010-01-04 14:49:30

Silverlight

2009-07-17 17:33:22

jQuery

2009-08-27 13:38:36

C#線程相關問題

2025-02-10 07:05:00

WinFormUI線程

2009-12-30 17:29:53

Silverlight

2024-05-27 00:27:59

WinForm線程應用程序

2010-01-06 17:02:28

.Net Framew

2009-12-21 17:35:24

ADO.NET對象

2010-01-21 10:12:57

VB.NET控件自動排

2009-08-04 13:39:43

ASP.NET 2.0

2010-03-16 19:29:26

Java多線程操作

2009-12-28 15:46:22

ADO.NET操作

2010-01-06 15:43:22

.Net Framew

2009-12-22 10:15:17

ADO.NET規(guī)則

2009-12-30 11:13:28

ADO.NET操作

2009-08-27 13:55:08

C#子線程

2009-08-07 17:42:43

ASP.NET Dat

2011-08-30 13:40:28

MySQL線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品日韩综合观看成人91 | 在线成人免费视频 | 久久69精品久久久久久久电影好 | 黄色一级大片在线免费看产 | 国产精品成人在线播放 | 成人精品啪啪欧美成 | 久久久久久久久久久久久久av | 午夜影院操 | 欧美在线视频一区 | 日韩在线视频一区 | 亚洲精品欧美一区二区三区 | 欧美一级免费观看 | 欧美一区二区三区在线免费观看 | 91视频18 | 黄色大片免费观看 | 免费在线成人 | 欧美日韩在线免费观看 | 国产欧美一级 | 国产污视频在线 | av毛片 | 一级片免费在线观看 | 国产亚洲精品美女久久久久久久久久 | 国产一区二区三区 | 久久精品91久久久久久再现 | 国产h视频 | 欧美伊人久久久久久久久影院 | 七七婷婷婷婷精品国产 | 国产ts人妖系列高潮 | 精品久久久久久 | 91玖玖| 国产精品一区二区欧美黑人喷潮水 | 国产成人99久久亚洲综合精品 | 亚洲精品乱 | 香蕉视频黄色 | 精品国产欧美一区二区三区成人 | 成人免费视频 | 在线观看av网站 | 久久午夜剧场 | 精品久久av| 久久久久国产精品一区三寸 | 国产第一区二区 |