当我们需要另建一个线程,在后台持续运行以完成某项工作,并不时的与主线程进行通信的时候,就用BackgroundWorker
public partial class Form1 : Form
BackgroundWorker bw = new BackgroundWorker();
public Form1()
{
InitializeComponent();
//设置BackgroundWorker属性
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
//连接BackgroundWorker对象处理程序
bw.DoWork += DoWork_Handle;
bw.ProgressChanged += ProgressChanged_Handler;
bw.RunWorkerCompleted += RunWorkCompleted_Handler;
//执行顺序
//1. bw.DoWork
//2. bw.ProgressChanged
//3. bw.RunWorkerCompleted
}
private void RunWorkCompleted_Handler(object sender, RunWorkerCompletedEventArgs e)
{
//在主线程里面执行
Console.WriteLine("RunWorkCompleted_Handler______" + Thread.CurrentThread.ManagedThreadId.ToString());
MessageBox.Show("RunWorkCompleted_Handler");
progressBar1.Value = 0;
if (e.Cancelled)
{
MessageBox.Show("Process was cancelled.", "Process Cancelled");
}
else
{
MessageBox.Show("Process compeleted normally.", "Process Completed");
}
}
private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs e)
{
//在主线程里面执行
Console.WriteLine("ProgressChanged_Handler______" + Thread.CurrentThread.ManagedThreadId.ToString());
//MessageBox.Show("ProgressChanged_Handler");
progressBar1.Value = e.ProgressPercentage;
//通过 e.UserState 传递对象参数
Type s = e.UserState.GetType();
PropertyInfo pName = s.GetProperty("Name");
PropertyInfo pAge = s.GetProperty("Age");
dynamic p = e.UserState;
Console.WriteLine(p.Name);
Console.WriteLine(p.Age);
}
private void DoWork_Handle(object sender, DoWorkEventArgs e)
{
//在子线程里面执行
Console.WriteLine("DoWork_Handle______" + Thread.CurrentThread.ManagedThreadId.ToString());
MessageBox.Show("DoWork_Handle");
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i <= 10; i++)
{
//是否取消后台操作
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
//调用ProgressChanged_Handler
var aa = new { Name = "张三", Age = 50 };
worker.ReportProgress(i * 10, aa);
Thread.Sleep(500);
}
}
}
private void proccessBtn_Click(object sender, EventArgs e)
{
Console.WriteLine("proccessBtn_Click______" + Thread.CurrentThread.ManagedThreadId.ToString());
//触发
if (!bw.IsBusy)
{
bw.RunWorkerAsync();
}
}
private void cancelBtn_Click(object sender, EventArgs e)
{
//关闭异步
bw.CancelAsync();
}
}