为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。
简单贴出几种处理情况的代码,慢慢琢磨吧!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace ThreadPoolDemo
- {
- public partial class ThreadForm : Form
- {
- //定义delegate以便Invoke时使用
- private delegate void SetProgressBarValue(int value);
- private BackgroundWorker worker;
- public ThreadForm()
- {
- InitializeComponent();
- }
- private void btnThread_Click(object sender, EventArgs e)
- {
- progressBar.Value = 0;
- //指示是否对错误线程的调用,即是否允许在创建UI的线程之外访问线程
- //CheckForIllegalCrossThreadCalls = false;
- Thread thread = new Thread(new ThreadStart(Run));
- thread.Start();
- }
- //使用线程来直接设置进度条
- private void Run()
- {
- while (progressBar.Value < progressBar.Maximum)
- {
- progressBar.PerformStep();
- }
- }
- private void btnInvoke_Click(object sender, EventArgs e)
- {
- progressBar.Value = 0;
- Thread thread = new Thread(new ThreadStart(RunWithInvoke));
- thread.Start();
- }
- //使用Invoke方法来设置进度条
- private void RunWithInvoke()
- {
- int value = progressBar.Value;
- while (value< progressBar.Maximum)
- {
- //如果是跨线程调用
- if (InvokeRequired)
- {
- this.Invoke(new SetProgressBarValue(SetProgressValue), value++);
- }
- else
- {
- progressBar.Value = ++value;
- }
- }
- }
- //跟SetProgressBarValue委托相匹配的方法
- private void SetProgressValue(int value)
- {
- progressBar.Value = value;
- }
- private void btnBackgroundWorker_Click(object sender, EventArgs e)
- {
- progressBar.Value = 0;
- worker = new BackgroundWorker();
- worker.DoWork += new DoWorkEventHandler(worker_DoWork);
- //当工作进度发生变化时执行的事件处理方法
- worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
- //当事件处理完毕后执行的方法
- worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
- worker.WorkerReportsProgress = true;//支持报告进度更新
- worker.WorkerSupportsCancellation = false;//不支持异步取消
- worker.RunWorkerAsync();//启动执行
- btnBackgroundWorker.Enabled = false;
- }
- //当事件处理完毕后执行的方法
- void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- btnBackgroundWorker.Enabled=true;
- }
- //当工作进度发生变化时执行的事件处理方法
- void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- //可以在这个方法中与界面进行通讯
- progressBar.Value = e.ProgressPercentage;
- }
- //开始启动工作时执行的事件处理方法
- void worker_DoWork(object sender, DoWorkEventArgs e)
- {
- int value = progressBar.Value;
- while (value < progressBar.Maximum)
- {
- worker.ReportProgress(++value);//汇报进度
- }
- }
- //使用System.Windows.Forms.Timer来操作界面能
- private void btnTimer_Click(object sender, EventArgs e)
- {
- progressBar.Value = 0;
- //注意在.net中有多个命名空间下存在Timer类,为了便于区别,使用了带命名空间形式
- System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
- timer.Interval = 1;
- timer.Tick += new EventHandler(timer_Tick);
- timer.Enabled = true;
- }
- //Timer中要定期执行的方法
- void timer_Tick(object sender, EventArgs e)
- {
- int value = progressBar.Value;
- if (value < progressBar.Maximum)
- {
- progressBar.Value = value+100;
- }
- }
- }
- }