using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.backgroundWorker1.WorkerReportsProgress = true;//指示BackgroundWorker是否可以报告进度更新。当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。
this.backgroundWorker1.DoWork += backgroundWorker1_DoWork;
this.backgroundWorker1.ProgressChanged += BackgroundWorker1_ProgressChanged;
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.BackgroundWorker1_RunWorkerCompleted);
}
/// <summary>
/// 这里是后台工作完成后的消息处理(异步操作完成或中途终止会触发该事件)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("运算完成了");
}
/// <summary>
/// 这里就是通过响应消息,来处理界面的显示工作(当调用ReportProgress方法时发生)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = e.UserState.ToString();
this.label1.Update();
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
this.button1.Enabled = false;
}
/// <summary>
/// 后台进程开始工作的地方,当执行backgroundworker.RunWorkerAsync方法时会触发该事件。
/// 并且传递DoWorkEventArgs参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Work(this.backgroundWorker1);//调用处理函数,也可以直接将处理写在这个方法里
}
/// <summary>
/// 处理函数
/// </summary>
/// <param name="bk"></param>
/// <returns></returns>
private bool Work(BackgroundWorker bk)
{
for (int i = 0; i < 100; i++)
{
//这里判断一下,是否用户要求取消后台进程,并可以尽早退出
//可以通过调用cancelAsync方法设置CancelationPending的值为false
if (bk.CancellationPending)
{
bk.ReportProgress(i, string.Format("{0}% ,操作被用户申请中断",i));
return false;
}
//调用ReportProgress方法,会触发ProgressChanged事件
bk.ReportProgress(i, string.Format("{0}%", i));
System.Threading.Thread.Sleep(1000);
}
return true;
}
}
}