【翻译】如何使用 C# 的 BackgroundWorker

原文地址:How To Use BackgroundWorker in C#

译文地址:如何使用 C# 的 BackgroundWorker


简单介绍

BackgroundWorker是一个System.ComponentModel组件库下的类,它可用于当你需要在后台做一些任务时或者不同的线程中在保持用户对UI的可用性(不冻结用户)的同时还能报告其进度。

代码的使用

Backgroundworker有3个事件,基本上照顾到了每一个需要做的工作。

  1. DoWork事件——实际的后台工作写在这里
  2. ProgressChanged事件——当后台工作有所进展时触发
  3. RunWorkerCompleted事件——当完成后台工作时调用

我创建了一个WPF应用程序样例来演示如何在C#中使用BackgroundWorker

<ProgressBar x:Name="progressbar"
 HorizontalAlignment="Left" Height="14"
 Margin="191,74,0,0" VerticalAlignment="Top"
 Width="133"/>
<Button x:Name="button" Content="Button"
 HorizontalAlignment="Left"
 Margin="249,97,0,0" VerticalAlignment="Top"
 Width="75" Click="button_Click"/>

在窗体的初始化函数中,我创建了一个新的BackgroundWorker对象同时注册了相应的事件。

BackgroundWorker bg;
public MainWindow()
{
  InitializeComponent();
  bg = new BackgroundWorker();
  bg.DoWork += Bg_DoWork;
  bg.ProgressChanged += Bg_ProgressChanged;
  bg.RunWorkerCompleted += Bg_RunWorkerCompleted;
  bg.WorkerReportsProgress = true;
}

这里是以上3个事件的具体实现。

private void Bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  MessageBox.Show("Task completed");
}

private void Bg_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  progressbar.Value += 1;
  //label.Content = e.ProgressPercentage;
}

private void Bg_DoWork(object sender, DoWorkEventArgs e)
{
  for (int i = 1; i &lt;= 10; i++)
  {
    Thread.Sleep(1000); //do some task
    bg.ReportProgress(0);
  }
}

为了能使其正常工作,你需要想办法触发它的DoWork事件,在这里我是通过按钮点击事件来实现的。

private void button_Click(object sender, RoutedEventArgs e)
{
  progressbar.Value = 0;
  progressbar.Maximum = 10;
  bg.RunWorkerAsync();
}

这是一个非常基础的BackgroundWorker样例,但它却是一个好的开端。

有人一定很好奇,如何它在后台工作的话是如何更新进度条的?

其实,ProgressChanged事件是运行在UI线程中的,而DoWork是运行在应用线程池中的。这就是为什么即使运行在不同的后台线程中,它都不会冻结UI并且还能更新progressbar控件的进度条的原因了。

如果您有任何问题或者疑虑的话,请留下您的评论。

兴趣点

理解如何使用BackgroundWorker是很有用的,这对你真的很有帮助——尤其是当你需要进行一些任务时,例如:并行进程,发送大量的电子邮件,保持用户对UI的可用性以及对进度的通知。

posted on 2016-08-08 02:13  ExDevilLee  阅读(304)  评论(0编辑  收藏  举报

导航