1.使用场景
BackgroundWorker 类允许在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能
会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间
延迟,则可以使用 BackgroundWorker 类方便地解决问题。
2.包含事件
若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。
若要开始此操作,请调用 RunWorkerAsync。
若要收到进度更新的通知,请处理 ProgressChanged 事件。
若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。
3.示例代码
namespace BackGroundWorker_processBar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.ultraGrid1.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
}
/// <summary>
/// 开始执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDo_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
/// <summary>
/// 包含耗时的事件处理程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ShowData();
}
/// <summary>
/// 进度通知,保证BackgroundWorker的属性WorkerReportsProgress设置为true
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// The progress percentage is a property of e
ultraProgressBar1.Value = e.ProgressPercentage;
this.ultraLabel1.Text = "已加载:"+e.ProgressPercentage + "%";
}
/// <summary>
/// 事件处理完成,该操作不在后台运行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.ultraLabel1.Text = "加载完成";
}
private void ShowData()
{
List<string> row1 = new List<string> { "中长期油气勘探规划", "是", "否" };
List<string> row2 = new List<string> { "勘探分区数据", "是", "否" };
DataTable dt = new DataTable();
string[] columnNames = new string[] { "成果类型", "对象类型设置", "特征设置" };
for (int j = 0; j < 3; j++)
{
DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = columnNames[j];
dt.Columns.Add(dataColumn); ;
}
for (int i = 0; i <=100; i++)
{
DataRow dr = dt.NewRow();
DataRow dr1 = dt.NewRow();
int j = 0;
foreach (string c in row1)
{
dr[columnNames[j++]] = c;
}
dt.Rows.Add(dr);
int jj = 0;
foreach (string c in row2)
{
dr1[columnNames[jj++]] = c;
}
dt.Rows.Add(dr1);
Thread.Sleep(20);
//通知进度
backgroundWorker1.ReportProgress(i);
}
this.ultraGrid1.DataSource = dt;
}
}
}