【翻译】如何使用 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的可用性以及对进度的通知。

时间: 2024-10-10 07:57:34

【翻译】如何使用 C# 的 BackgroundWorker的相关文章

【翻译】C#中使用BackgroundWorker实现多线程

原文地址:MultiThreading Using a Background Worker, C# 介绍 当开发Windows Forms应用程序时,你会常常注意到:当执行某个耗时的操作,比如处理一个打文件或是从远程服务器请求数据 ,用户界面会进入假死状态.这是由于你的应用程序是运行在单线程下.这个线程负责响应用户界面的操作,同时也负责处理应用程序中所有的事件和方法.因此,耗时的操作会阻塞你的用户界面,直到操作完成.今天,我们将要做的是把这些耗时的操作移到另一个不同的线程中,当以在另一边执行操作

C# BackgroundWorker使用总结

查询了一下MSDN文档,其中微软就BackgroundWorker类的功能有这么一个描述(英文的,根据个人理解翻译):BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作(比如文件下载数据库事务等),并且想要一个响应式的UI来反应当前耗时操作的进度. 可以看的出来,BackgroundWorker组件提供了一种执行异步操作(后台线程)的同时,并且还能妥妥的显示操作进度的解决方案.于是乎,我便深入的了解了一下BackgroundWorker类.针

在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】

前言 本人一直开发Android应用,目前Android就业形势恶劣,甚至会一路下滑,因此决定学习服务器开发.采用的语言是java,IDE是Intellij,在下载Intellij的同时看到官网很多优秀的guide文章,于是按照guide成功完成了一个RESTful的demo.官方文档非常简洁,给我带来了很大的帮助,于是翻译之,希望对其他不愿意看原文的人有所帮助.由于水平有限,读者发现错误请指正,谢谢. 原文地址: https://www.jetbrains.com/help/idea/2016

Java 7 Concurrency Cookbook 翻译 序言

在日常的Java代码开发过程中,很难免地有对多线程的需求,掌握java多线程和并发的机制也是Java程序员写出更健壮和高效代码的基础.笔者找寻国内已出版的关于Java多线程和并发的的中文书籍和翻译书籍,大家一致推荐的是<Java Concurrency in Practice>,笔者暂时还没有看英文原版,笔者看的是它的翻译版<Java并发编程实战>,笔者读起来感觉并不通畅,不知道是翻译的问题还是原版本来就写得不够流畅,同时感觉知识的深度也超过了入门的需求. 笔者在机缘巧合之下,发现

[翻译] ORMLite document -- How to Use Part (二)

前言 此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正.若翻译与原文档出现任何的不相符,请以原文档为准.原则上建议学习原英文文档. ---------------------------------------------------------------------------------------------- 二.如何使用 2.7 表的创建 ORMLite 提供了一些工具类为您存储在数据库中的类创建 table 和 schema. 2.7.1 Tabl

Reveal常用技巧(翻译来自Reveal官网blog)

翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥都还没配置呢,想先随便玩玩看,怎么办? 我们花了不少时间开发这个复杂程度类似与实际场景的Sample应用──Soundstagram(音频分享版的Instagram, ¯\_(ツ)_/¯),就是为了让大家能最快速地上手Reveal,尝试它的各种强大功能. 在 Help 菜单项中,点击 Inspect

qt 国际化(翻译时会触发changeEvent)

1. 修改工程文件 .pro ,加入翻译源文件 hello_world.ts: TRANSLATIONS += \        Resource/translations/hello_world.ts 写代码时需要注意下面两点:  2. 源码用 utf-8 字符集3. 源码中需要翻译的字符串必须用英文(不能有中文或其它语言),则需要用 tr()  函数.  例如: QMessageBox::information(this,tr("Information"),tr("Hel

还在吐槽翻译的外版书质量差吗?谈谈我个人的理解

很难想象哪个学习计算机技术的人是没看过这方面书籍的,如果只是在网上看看技术贴,那样得来的知识绝对是离散的,不系统的.而要真正学好一门学问(比如一门计算机语言或者一门技术),一本好书的作用是不言而喻的.很多人抱怨国人在技术图书方面抄来抄去,不求甚解,虽然出版图书者甚众,但最终成为精品者却凤毛麟角.于是,更多读者热衷于外版书.但显然,并非所有国人的外语水平都足以在阅读原版书籍时毫无障碍.那么退而求其次,寻求翻译版就成为一种看似不得已的选择. 不幸的是,网上对于翻译版书籍的吐槽可以说从未消停.我也看过

VLD 1.0 ReadMe翻译尝试

近期想学习下VLD的实现,打算从最简单的V1.0版本看起.以下是V1.0版本自己尝试翻译下,最新的2.x版本似乎强大了很多. 简介 Visual C++提供了内置的内存检测机制,但其充其量只满足了最小定位需求.VLD工具定位为内置内存泄漏的替代,提供了如下特性: 泄漏内存块的全调用栈回溯,包括文件及其行号: 泄漏内存完整转储(hex和ascii格式): 可定制的泄漏报告等级(报告的详细程度可配置) 相对于Purify和BoundsChecher工具其是免费的,而其他免费工具,往往需要入侵式代码.