using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace BackGroundWork
{
public partial class Form1 : Form
{
private BackgroundWorker m_BackgroundWorker;// 申明后台对象
public Form1()
{
InitializeComponent();
m_BackgroundWorker = new BackgroundWorker(); // 实例化后台对象
m_BackgroundWorker.WorkerReportsProgress = true; // 设置可以通告进度
m_BackgroundWorker.WorkerSupportsCancellation = true; // 设置可以取消
m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork);//执行这个RunWorkerAsync()方法时执行
//调用BackgroundWorker bw = new BackgroundWorker();bw.ReportProgress(i++);调用这个方法时发生
m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress);
//当后台执行完成 或被取消 或引发异常时发生
m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork);
m_BackgroundWorker.RunWorkerAsync(this);
}
/// <summary>
/// BackgroundWorker执行的长时间方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void DoWork(object sender, DoWorkEventArgs e)
{
//也可以直接用这个m_BackgroundWorker申明的后台对象
BackgroundWorker bw = sender as BackgroundWorker;
int i = 0;
while (i <= 100)
{
//判断应用程序是否已请求取消后台操作
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
//注意 这里调用ReportProgress(int) 方法时 会执行UpdateProgress()方法
bw.ReportProgress(i++);
Thread.Sleep(1000);
}
}
/// <summary>
/// 实时更新进度的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void UpdateProgress(object sender, ProgressChangedEventArgs e)
{
int progress = e.ProgressPercentage;
label1.Text = string.Format("{0}", progress);
}
/// <summary>
/// 事件执行完成的回调方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CompletedWork(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("Error");//发生错误
}
else if (e.Cancelled)
{
MessageBox.Show("Canceled");//取消后台
}
else
{
MessageBox.Show("Completed");//完成
}
}
//请求取消后台挂起的操作
private void button1_Click(object sender, EventArgs e)
{
m_BackgroundWorker.CancelAsync();
}
}
}
/*BackgroundWorker传递参数*/
bw_DataInterface.DoWork += new DoWorkEventHandler(bw_DataInterface_DoWork);
bw_DataInterface.RunWorkerAsync("Test parameters");
在DoWork Func: DoWork(object sender, DoWorkEventArgs e)
{
string tt=e.Argument.ToString();
}
C# BackgroundWorker对象 异步执行,避免界面卡死
最新推荐文章于 2022-08-30 19:00:00 发布