程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#中跨線程操作控件(1)

C#中跨線程操作控件(1)

編輯:關於C語言

一、前面的話

對於一些耗時型操作(如文件下載),讓主線程去處理不是明智的選擇,雖然這樣做會使得程序開發起來很簡單。因為WinForm程序設計的 准則之一就是Responsive,即讓用戶覺得程序一直在工作,而不是感覺它在罷工(呵呵,事實上,程序不會罷工,只是你沒給他表現得機會, 如果它有情感,會覺得委屈死)。.Net FrameWork支持在程序用應用線程編程,這可以很好的解決上述問題,不過有時候直接使用Thread和 Threadstart顯得有些繁瑣也沒必要,為此.Net Framework提供了BackgroundWorker組件來應付一些簡單的應用環境。

本文將分別對上述兩種情況的跨線程操作控件方法進行闡述。

二、BackgroundWorker下的跨線程操作控件

BackgroundWorker是個很好的伙計,因為它可以忙你搞定許多髒活累活。具體的講,它可以自動的幫你創建工作線程,可以在工作時把工作 的進展情況告訴給你,可以在工作完成時通知並幫你做一些收尾的工作,當你覺得他很煩的時候,你還可以隨時讓他停下來。

BackgroundWorker組件提供了三個事件:DoWork,ProgressChanged和RunWorkerCompleted。Dowork顧名思義是用來處理工作業務的 ,在這裡面加入你想讓工作線程在後台處理的代碼即可。但是在這個事件中不能加入跨線程操作的代碼。如下圖,當我試圖改變Label.Text的 值時,拋出了異常信息:

不過這裡有個例外,就是對於ToolStrip及其從該類繼承過來的容器控件,某些在該容器上的控件(如StatusLabel)可以在工作線程 中直接操作。至於為啥,我沒有去深究,不過根據圖中的提示信息,一個很合理的解釋就是這類控件和BackgroundWorker由同一個線程創建。

ProgressChanged和RunWorkerCompleted事件分別用來報告工作線程的工作情況和在工作線程結束後進行一些操作。這兩個事件都支 持跨線程操作控件。下面通過一個簡單的實例進行驗證。

用程序實現將一個目錄中的文件拷貝至另外一個目錄。

1.程序界面設計如下:

2.工作流程:(1)設置源目錄和目標目錄(2)拷貝文件,在ListVIEw中顯示拷貝信息,更新狀態欄中的進度條和當前處理文件信息(3) 拷貝過程結束後,用MessageBox提示拷貝文件數量,同時清空源目錄和目標目錄信息。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved