最近仿佛跟Thread很有缘,时间倒计时可以用它,今天发现可以使用线程了模拟进度条的进度。在我实现了小demo之后,又发现了很多实现进度条效果的方法,真是条条大路通罗马,怎样写都可以实现,暗爽不行不行的。
1.1插入一个timer控件,属性false,interval 100。插入button,插入textbox如下图。
1.2 代码实现
public void output(string log) { if (textBox1.GetLineFromCharIndex(textBox1.Text.Length)>100) { textBox1.Text = ""; } textBox1.AppendText (DateTime.Now.ToString ("HH:mm:ss "+log +"\r\n")); } private void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value<progressBar1.Maximum) { progressBar1.Value++; output("进度进行中 [" + progressBar1.Value.ToString() + "/" + progressBar1.Maximum + "]...."); } else { output ("进度已完成!"); timer1.Enabled = false; } }
private void button1_Click(object sender, EventArgs e) { output("进度开始!"); progressBar1.Value = 0; progressBar1.Minimum = 0; progressBar1.Maximum = 100; timer1.Enabled = true; }
2.1 用一个label,一个button,一个进度条如下图。
2.2 代码实现
private void button1_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); }
2.3实现效果
3.1 实现方法有很多,不怕不知道,就怕不知道
3.2 权衡利弊用最适合你系统的方法
3.3 把功能抽离环境之后,做了好几个小DEMO实现都没有问题,当加入到正在开发的项目中时,就出现了问题。测试环境要真实!开发环境和部署环境要提前做了充分的了解,不要开发了半天才发现框架版本不一致,那就没地方哭了。。