代码如下:
private ManualResetEvent manualReset = new ManualResetEvent(true);
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerChanged);
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_Dowork);
progressBar1.Maximum = 100000;
}
//这是后台进程开始工作时,调用工作函数的地方。你可以把现有的处理函数写在这
private void backgroundWorker1_Dowork(object sender, DoWorkEventArgs e)
{
work(backgroundWorker1);
}
//这是后台工作完成后的消息处理,可以在这里进行后续的处理工作
private void backgroundWorker1_RunWorkerChanged(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("处理完成");
}
//通过响应消息,来处理界面的显示工作
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
label2.Text = e.UserState.ToString();
this.label2.Update();
}
private bool work(BackgroundWorker bk)
{
int tatle = 100001;
for(int i = 0; i < tatle; i++)
{
if (bk.CancellationPending) //这是是否用户要求取消后台进行,并可以尽早退出
{
bk.ReportProgress(i, string.Format("当前值是{0},操作被用户申请中断", i));
return false;
}
manualReset.WaitOne();//如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。
Thread.Sleep(1);
bk.ReportProgress(i, string.Format("当前值是{0}", i));
}
return true;
}
private void button1_Click(object sender, EventArgs e)
{
if (this.backgroundWorker1.IsBusy)
return;
this.backgroundWorker1.RunWorkerAsync();
}
private void button2_Click(object sender, EventArgs e)
{
if (button2.Text == "暂停")
{
manualReset.Reset();//暂停当前线程的工作,发信号给waitOne方法,阻塞
button2.Text = "继续";
}
else
{
manualReset.Set();//继续某个线程的工作
button2.Text = "暂停";
}
// this.backgroundWorker1.CancelAsync();
}
private void button3_Click(object sender, EventArgs e)
{
this.Close();
}
如有不足之处,请进行留言