多线程执行显示进度条的实例

前几天刚用过,修改了一下,参考了一位前辈的例子
http://blog.mylover.cn/2009/02/post-3.html
C# code
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace TestProgressBar { public partial class TestForm : Form { //线程开始的时候调用的委托 private delegate void maxValueDelegate(WordEventArgs e); //线程执行中调用的委托 private delegate void nowValueDelegate(WordEventArgs e); //线程执行结束调用的委托 private delegate void endValueDelegate(WordEventArgs e); public TestForm() { InitializeComponent(); } private void btn_Test_Click(object sender, EventArgs e) { Worker worker = new Worker(); /// 订阅事件 worker.OnStartWorkEvent += new WorkEventHandler(this.OnStartWorkEventHandler); worker.OnDoWorkEvent += new WorkEventHandler(this.OnDoWorkEventHandler); worker.OnEndWorkEvent += new WorkEventHandler(this.OnEndWorkEventHandler); Thread thread = new Thread(new ThreadStart(worker.Work)); thread.Start(); } /// <summary> /// 线程开始事件,设置进度条最大值,需要一个委托来替我完成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void OnStartWorkEventHandler(object sender, WordEventArgs e) { maxValueDelegate max = new maxValueDelegate(SetMaxValue); this.Invoke(max, e); } /// <summary> /// 线程执行中的事件,设置进度条当前进度,需要一个委托来替我完成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void OnDoWorkEventHandler(object sender, WordEventArgs e) { nowValueDelegate now = new nowValueDelegate(SetNowValue); this.Invoke(now, e); } /// <summary> /// 线程完成事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void OnEndWorkEventHandler(object sender, WordEventArgs e) { endValueDelegate end = new endValueDelegate(SetEndValue); this.Invoke(end, e); } /// <summary> /// 被委托调用,专门设置进度条最大值的 /// </summary> /// <param name="maxValue"></param> private void SetMaxValue(WordEventArgs e) { this.probar_Test.Maximum = e.Position; lbl_Info.Text = e.Info; } /// <summary> /// 被委托调用,专门设置进度条当前值的 /// </summary> /// <param name="nowValue"></param> private void SetNowValue(WordEventArgs e) { this.probar_Test.Value = e.Position; lbl_Info.Text = e.Info; } /// <summary> /// 被委托调用,专门设置进度条结束后的处理 /// </summary> /// <param name="nowValue"></param> private void SetEndValue(WordEventArgs e) { this.probar_Test.Value = e.Position; ; lbl_Info.Text = e.Info; MessageBox.Show(e.Info); } } }
C# code
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace TestProgressBar { public delegate void WorkEventHandler(object sender, WordEventArgs e); class Worker { /// <summary> /// 开始事件 /// </summary> public event WorkEventHandler OnStartWorkEvent; /// <summary> /// 执行时事件 /// </summary> public event WorkEventHandler OnDoWorkEvent; /// <summary> /// 结束事件 /// </summary> public event WorkEventHandler OnEndWorkEvent; public Worker() { } private void SendEvents(WordEventArgs e) { switch (e.Stage) { case WorkStage.BeginWork: if (OnStartWorkEvent != null) OnStartWorkEvent(this, e); break; case WorkStage.DoWork: if (OnDoWorkEvent != null) OnDoWorkEvent(this, e); break; case WorkStage.EndWork: if (OnEndWorkEvent != null) OnEndWorkEvent(this, e); break; default: if (OnDoWorkEvent != null) OnDoWorkEvent(this, e); break; } } public void Work() { int iTotal = 100;//计算工作量,这里是设置为100,如果是上传,或者下载,就是文件的大小,循环遍历的话,这就是最大的那个循环数 SendEvents(new WordEventArgs(WorkStage.BeginWork, "开始工作!", iTotal)); int iCount = 0; for (int i = 0; i < iTotal; i++) { Thread.Sleep(50);//休息50毫秒,模拟执行大数据量操作, iCount = i; // 此处计算所处的位置,如果是上传或者下载了多少了, SendEvents(new WordEventArgs(WorkStage.DoWork, "正在工作ing " + iCount.ToString(), iCount)); } SendEvents(new WordEventArgs(WorkStage.EndWork, "结束工作!", iTotal)); } } class WordEventArgs : EventArgs { //主要是用来往外传递信息的 public WorkStage Stage; public string Info = ""; public int Position = 0; public WordEventArgs(WorkStage Stage, string Info, int Position) { this.Stage = Stage; this.Info = Info; this.Position = Position; } } public enum WorkStage { BeginWork, //准备工作 DoWork, //正在工作 EndWork, //工作结束 } }

posted on 2011-09-23 15:14  l1b2q31  阅读(850)  评论(0编辑  收藏  举报

导航