任务正在运行时柱塞客户操作,并且可以看到任务运行状态
任务完成窗口关闭
源码实例下载地址https://pan.baidu.com/s/1skGYzTF
以下是backgroundWorkerFrm窗体核心代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BackgroundWorker窗体状态
{
public partial class backgroundWorkerFrm : Form
{
BackgroundWorker worker = new BackgroundWorker();
public backgroundWorkerFrm()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerCompleted += CompleteWork;//操作完成就会执行CompleteWork事件
worker.ProgressChanged += UpdateProgressBar;//进程发现变化时执行UpdateProgressBar事件
}
public DoWorkEventHandler DoWork { set { worker.DoWork += value; } }
private void UpdateProgressBar(object sender, ProgressChangedEventArgs e)//进度条
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void CompleteWork(object sender, RunWorkerCompletedEventArgs e)//关闭窗口
{
this.DialogResult = DialogResult.OK;
}
public void RunAndShow()
{
if (!worker.IsBusy)
{
worker.RunWorkerAsync();
this.ShowDialog();
}
}
protected override void OnClosing(CancelEventArgs e)
{
if (worker != null && worker.IsBusy)
{
worker.CancelAsync();
}
//base.OnClosing(e);
}
private void button1_Click(object sender, EventArgs e)
{
if (worker != null && worker.IsBusy)
{
worker.CancelAsync();
}
}
public void SetLable(string msg)
{
this.BeginInvoke((EventHandler)(delegate { label1.Text = msg; }));
}
}
}
以下是Form1核心代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace BackgroundWorker窗体状态
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
backgroundWorkerFrm frm ;
private void button1_Click(object sender, EventArgs e)
{
frm = new backgroundWorkerFrm();
frm.DoWork = test;
frm.RunAndShow();
}
private void test(object sendr, DoWorkEventArgs e)
{
BackgroundWorker bw = sendr as BackgroundWorker;
for (int i = 0; i <= 500; i++)
{
bw.ReportProgress(100 * i / 500);
Thread.Sleep(50);//延时作用,如果不延时就会执行很快 进度条一下就刷到100%
this.BeginInvoke((EventHandler)(delegate { label2.Text = i.ToString(); }));
if (bw.CancellationPending)
{
break;//取消时中断任务
}
if (i == 100)
{
frm.SetLable("100");
}
if (i == 200)
{
frm.SetLable("200");
}
if (i == 300)
{
frm.SetLable("300");
}
}
}
}
}