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 BackGroudWork_TEST
{
public partial class FrmBackWork : Form
{
private BackgroundWorker ga;
private bool Stop = false;
public FrmBackWork()
{
InitializeComponent();
this.ga = new BackgroundWorker();
this.ga.WorkerReportsProgress = true;
this.ga.WorkerSupportsCancellation = true;
this.ga.ProgressChanged += new ProgressChangedEventHandler(ga_ProgressChanged);
this.ga.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ga_RunWorkerCompleted);
this.ga.DoWork += new DoWorkEventHandler(ga_DoWork);
}
void ga_DoWork(object sender, DoWorkEventArgs e)
{
work(this.ga);
}
private bool work(BackgroundWorker bk)
{
int tatle = 100;
for (int i = 0; i <= tatle; i++)
{
if (this.Stop) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
{
bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
i--;
Thread.Sleep(100);
continue;
}
//处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
Thread.Sleep(100);
}
return true;
}
void ga_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("运算终于完成了");
}
void ga_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = e.UserState.ToString();
this.label1.Update();
}
private void button2_Click(object sender, EventArgs e)
{
//用户要求取消时,就这样处理一下。有时不太灵喔。
//this.ga.CancelAsync();
this.Stop = true;
}
private void button1_Click(object sender, EventArgs e)
{
//这一句,就是让后台工作开始。
if (!this.ga.IsBusy)
{
this.ga.RunWorkerAsync(this.Stop);
}
else
{
this.Stop = false;
}
}
}
}
C# 异步执行 BackgroundWork 异步暂停
最新推荐文章于 2024-06-03 16:04:40 发布