WinForm:进度条的实现(异步)
在WinForm中經常遇到一些費時的操作界面,比如統(tǒng)計某個磁盤分區(qū)的文件夾或者文件數(shù)目,如果分區(qū)很大或者文件過多的話,處理不好就會造成“假死”的情況,或者報“線程間操作無效”的異常,為了解決這個問題,可以使用委托來處理,在.net2.0中還可以用BackgroundWorker類。
BackgroundWorker類是.net 2.0里新增加的一個類,對于需要長時間操作而不需要用戶長時間等待的情況可以使用這個類。
注意確保在?DoWork?事件處理程序中不操作任何用戶界面對象。而應該過?ProgressChanged?和?RunWorkerCompleted?事件與用戶界面進行通信。
?它有幾個屬性:
CancellationPending——指示應用程序是否已請求取消后臺操作。
IsBusy——指示?BackgroundWorker?是否正在運行異步操作
WorkerReportsProgress——該值指示?BackgroundWorker?能否報告進度更新
WorkerSupportsCancellation——該值指示?BackgroundWorker?是否支持異步取消
還有如下事件:
DoWork——調用?RunWorkerAsync?時發(fā)生。
ProgressChanged——調用?ReportProgress?時發(fā)生。
RunWorkerCompleted——當后臺操作已完成、被取消或引發(fā)異常時發(fā)生。
還有如下方法:
CancelAsync——請求取消掛起的后臺操作
ReportProgress——引發(fā)?ProgressChanged?事件
RunWorkerAsync——開始執(zhí)行后臺操作
關于BackgroundWorker類更多詳細介紹可參考:http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx
下載與本文相關的ProcessTest示例相關代碼。
http://files.cnblogs.com/Jason_z/ProcessTest.rar
程序運行界面
主要代碼如下:
?
using?System.Collections.Generic;
using?System.ComponentModel;
using?System.Data;
using?System.Drawing;
using?System.Linq;
using?System.Text;
using?System.Windows.Forms;
namespace?ProcessTest
{
????public?partial?class?Form1?:?Form
????{
????????public?Form1()
????????{
????????????InitializeComponent();
????????????worker.WorkerReportsProgress?=?true;
????????????worker.WorkerSupportsCancellation?=?true;
????????????//正式做事情的地方
????????????worker.DoWork+=new?DoWorkEventHandler(DoWork);
????????????//任務完稱時要做的,比如提示等等
????????????worker.ProgressChanged?+=?new?ProgressChangedEventHandler(ProgessChanged);
????????????//任務進行時,報告進度
????????????worker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(CompleteWork);
????????}
????????//調用?RunWorkerAsync?時發(fā)生
????????public?void?DoWork(object?sender,?DoWorkEventArgs?e)
????????{
????????????e.Result?=?ComputeFibonacci(worker,?e);
????????????//獲取異步操作結果的值,當ComputeFibonacci(worker,?e)返回時,異步過程結束
????????}
????????//調用?ReportProgress?時發(fā)生
????????public?void?ProgessChanged(object?sender,?ProgressChangedEventArgs?e)
????????{
????????????this.progressBar1.Value?=?e.ProgressPercentage;
????????????//將異步任務進度的百分比賦給進度條
????????}
????????//當后臺操作已完成、被取消或引發(fā)異常時發(fā)生
????????public?void?CompleteWork(object?sender,?RunWorkerCompletedEventArgs?e)
????????{
????????????MessageBox.Show("完成!");
????????}
????????private?int?ComputeFibonacci(object?sender,?DoWorkEventArgs?e)
????????{
????????????for?(int?i?=?0;?i?<?1000;?i++)
????????????{
????????????????//判斷應用程序是否取消后臺操作
????????????????if(worker.CancellationPending)
????????????????{
????????????????????e.Cancel?=?true;
????????????????}
????????????????else
????????????????{
????????????????????worker.ReportProgress(i);
????????????????}
????????????????System.Threading.Thread.Sleep(10);
????????????}
????????????return?-1;
????????}
????????private?void?btnStart_Click(object?sender,?EventArgs?e)
????????{
????????????worker.RunWorkerAsync();
????????????btnStart.Enabled?=?false;
????????????btnPause.Enabled?=?true;
????????}
????????private?void?btnPause_Click(object?sender,?EventArgs?e)
????????{
????????????btnPause.Enabled?=?false;
????????????btnStart.Enabled?=?true;
????????????worker.CancelAsync();
????????}
????}
}
?
轉載于:https://www.cnblogs.com/Jason_z/archive/2009/10/15/1583669.html
總結
以上是生活随笔為你收集整理的WinForm:进度条的实现(异步)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hdu 4415 Assassin's
- 下一篇: 利用Tushare合成期货主力连续数据