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;

}

}

}

}
