65.9K
CodeProject 正在变化。 阅读更多。
Home

基本的 Backgroundworker

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (4投票s)

2010年2月12日

CPOL

1分钟阅读

viewsIcon

51763

downloadIcon

2195

演示如何使用 backgroundworker。

引言

有时你只需要一个简单的后台线程来执行工作,并在完成时处理结果。 Microsoft 提供了一个 BackgroundWorker 组件,它在 Windows Form 上就像一个线程一样工作。我想演示如何使用 BackgroundWorker 组件。

背景

BackgroundWorker 有三个事件

  • DoWork - 当调用 backgroundworker 运行时,此方法将处理工作。
  • ProgressChanged - 用于向进度条报告进度。
  • RunWorkerCompleted - 将 DoWork 的返回结果的代码放在这里。

Using the Code

设置窗体。

这里我有

  • 2 个 TextBox
  • 1 个 Label
  • 1 个 Button
  • 1 个进度条
  • 1 个 backgroundWorker (在工具箱的“组件”部分下)

backgroundworker 属性 WorkerReportProgress 需要设置为 true 才能报告进度

backgroundworker 组件如何运行?

private void btnCalculate_Click(object sender, EventArgs e)
{
  MyStruct myStruct = new MyStruct(int.Parse(txtX.Text),int.Parse(txtY.Text));
  backgroundWorker1.RunWorkerAsync(myStruct);
  btnCalculate.Enabled = false;
}    

当按下“计算”按钮时,它将调用 backgroundworker.RunWorkerAsync(object)RunWorkerAsync 将触发事件 _DoWork

backgroundWorker1_DoWork 事件中,你将放置执行某些操作的代码。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
 // Get the Object passed in
 MyStruct my = (MyStruct)e.Argument;
 // Do some work 
 for (int i = 0; i <= 10; i++)
 {
  backgroundWorker1.ReportProgress(i);
  Thread.Sleep(100);
 }
 // return the result 
 e.Result = my.X + my.Y;
}

e.Argument 很重要,因为这是我们将取消包装传递到 backgroundworker 组件的对象的方式。

在这个例子中,将只是休眠并报告进度。 在一段时间后,它将计算结果并将其返回到 backgrroundWorker1_RunWorkerCompleted

backgroundworker 报告进度时,它将更新 _ProgressChanged

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   progressBar1.Value = e.ProgressPercentage;
}

最后,当它完成时,它将返回结果,我们希望显示结果,因此我们将代码放在 _RunWorkerCompleted 中。

private void backgroundWorker1_RunWorkerCompleted
	(object sender, RunWorkerCompletedEventArgs e)
{
    lblAnswer.Text = e.Result.ToString();
    btnCalculate.Enabled = true;
}

历史

  • 2010 年 2 月 11 日:初始发布
© . All rights reserved.