最近在做壹個VSS日誌分析工具,使用C#進行開發,在完成了所有功能後,發現,從服務器下載VSS日誌非常耗時,因為此,導致工具使用體驗不好,所以,準備增加壹個進度條。
鑒於C#不經常使用,壹下子搞個進度條貌似比較難,而且其他的開發任務也在壹並進行,所以,昨天壹天,並沒有多大的進展。
今天,是周末,正好可以利用,在查閱了大量網上資料以及實例後,我制作了幾個實例,以備後來之用。
使用C#顯示進度條,涉及到多線程編程,我只探索了使用BackgroundWorker和Thread的方法,下面分別列出。
第壹種:使用BackgroundWorker進行進度條控制
BackgroundWorker對象有三個主要的事件:
DoWork - 當BackgroundWorker對象的多線程操作被執行時觸發。
RunWokerCompleted - 當BackgroundWoker對象的多線程操作完成時觸發。
ProgressChanged - 當BackgroundWorker對象的多線程操作狀態改變時觸發。
WorkerReportsProgress - 如果想讓BackgroundWorker對象以異步的方式報告線程實時進度,必須將該屬性的值設為true。
BackgroundWorker對象的ReportProgress方法用於向主線程返回後臺線程執行的實時進度。
實例代碼壹,控制主窗體中的進度條顯示
[csharp]?view plaincopy
public?partial?class?Form1?:?Form?
{?
///?<summary>?
///?後臺線程?
///?</summary>?
private?BackgroundWorker?bkWorker?=?new?BackgroundWorker();?
///?<summary>?
///?步進值?
///?</summary>?
private?int?percentValue?=?0;?
public?Form1()?
{?
InitializeComponent();?
bkWorker.WorkerReportsProgress?=?true;?
bkWorker.WorkerSupportsCancellation?=?true;?
bkWorker.DoWork?+=?new?DoWorkEventHandler(DoWork);?
bkWorker.ProgressChanged?+=?new?ProgressChangedEventHandler(ProgessChanged);?
bkWorker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(CompleteWork);?
}?
private?void?btnStart_Click(object?sender,?EventArgs?e)?
{?
percentValue?=?10;?
this.progressBar1.Maximum?=?1000;?
//?執行後臺操作?
bkWorker.RunWorkerAsync();?
}?
public?void?DoWork(object?sender,?DoWorkEventArgs?e)?
{?
//?事件處理,指定處理函數?
e.Result?=?ProcessProgress(bkWorker,?e);?
}?
public?void?ProgessChanged(object?sender,?ProgressChangedEventArgs?e)?
{?
//?bkWorker.ReportProgress?會調用到這裏,此處可以進行自定義報告方式?
this.progressBar1.Value?=?e.ProgressPercentage;?
int?percent?=?(int)(e.ProgressPercentage?/?percentValue);?
this.label1.Text?=?"處理進度:"?+?Convert.ToString(percent)?+?"%";?
}?
public?void?CompleteWork(object?sender,?RunWorkerCompletedEventArgs?e)?
{?
this.label1.Text?=?"處理完畢!";?
}?
private?int?ProcessProgress(object?sender,?DoWorkEventArgs?e)?
{?
for?(int?i?=?0;?i?<=?1000;?i++)?
{?
if?(bkWorker.CancellationPending)?
{?
e.Cancel?=?true;?
return?-1;?
}?
else?
{?
//?狀態報告?
bkWorker.ReportProgress(i);?
//?等待,用於UI刷新界面,很重要?
System.Threading.Thread.Sleep(1);?
}?
}?
return?-1;?
}?
}?
下面是運行結果