话不多说,直接上马吧,太累了
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 CSDN
{
public partial class Form1 : Form
{
bool IsCancel = false;//是否取消
int progress = 0;//当前进度
string progressTip = "";//当前工作提示,需要可以显示到界面
public Form1()
{
InitializeComponent();
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(GetDoWorkEventArgs("1"));
this.backgroundWorker1.WorkerSupportsCancellation = true; //是否支持异步取消 如果要取消操作必须设置true
this.backgroundWorker1.WorkerReportsProgress = true;
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
}
private Action<object, DoWorkEventArgs> GetDoWorkEventArgs(string _parm)
{
switch (_parm)
{
default:
case "1":
return backgroundWorker1_DoWork;
case "2":
return backgroundWorker2_DoWork;
case "3":
return backgroundWorker3_DoWork;
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
progressTip = "准备1!";
backgroundWorker1.ReportProgress(0); //更新进度
Sleep(1);
backgroundWorker1.ReportProgress(100);
progressTip = "完成1!";
}
catch (OperationCanceledException)
{
e.Cancel = true;
}
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
try
{
progressTip = "准备2!";
backgroundWorker1.ReportProgress(0);
Sleep(10);
backgroundWorker1.ReportProgress(100);
progressTip = "完成2!";
}
catch (OperationCanceledException)
{
e.Cancel = true;
}
}
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
try
{
progressTip = "准备3!";
backgroundWorker1.ReportProgress(0);
Sleep(100);
backgroundWorker1.ReportProgress(100);
progressTip = "完成3!";
}
catch (OperationCanceledException)
{
e.Cancel = true;
}
}
/// <summary>
/// 延时
/// </summary>
/// <param name="Second"></param>
private void Sleep(int Second)
{
DateTime temp = DateTime.Now.AddSeconds(Second);
while (DateTime.Now < temp)
{
if (IsCancel) //在延时等待时,如果取消了,就要抛出异常,终止
{
throw new OperationCanceledException();
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progress = e.ProgressPercentage; //获取异步任务的进度百分比
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (IsCancel)
{
return;
}
}
//启动
private void button1_Click(object sender, EventArgs e)
{
IsCancel = false;
backgroundWorker1.RunWorkerAsync();
}
//停止
private void button2_Click(object sender, EventArgs e)
{
try
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
DateTime timeout = DateTime.Now.AddSeconds(1);
while (backgroundWorker1 != null && !backgroundWorker1.CancellationPending && DateTime.Now < timeout)
{
System.Threading.Thread.Sleep(1);
}
IsCancel = true;
}
}
catch (OperationCanceledException)
{
backgroundWorker1.CancelAsync();
IsCancel = true;
}
}
}
}