草庐IT

BackgroundWorker用法示例

LXLR 2023-03-28 原文

BackgroundWorker:

1.定义:是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。

2.使用场景:耗时的操作(如下载和数据库事务)长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果我们需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。

3.控件简介:有三个控件

  • DoWork: 在程序中调用RunWorkerAsync会启动DoWork事件处理。
  • ProgressChanged: 在事件处理过程中,调用ReportProgress方法则会启动ProgressChanged事件的事件处理。
  • RunWorkerCompleted: 当DoWork事件处理完成时,则会触发RunWorkerCompleted事件。
  • 注意:在DoWork事件处理程序中不操作任何用户界面对象,否则会停止响应。应该通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。

4.示例:

 1 using System;
 2 using System.ComponentModel;
 3 using System.Threading;
 4 using System.Windows.Forms;
 5  
 6 namespace bcworker
 7 {
 8     public partial class Form1 : Form
 9     {
10         //后台工作
11         private BackgroundWorker bw = new BackgroundWorker();
12  
13         public Form1()
14         {
15             InitializeComponent();
16             //后台工作初始化
17             bw.WorkerReportsProgress = true;//报告进度
18             bw.WorkerSupportsCancellation = true;//支持取消
19             bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//开始工作
20             bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//进度改变事件
21             bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//进度完成事件
22         }
23  
24         private void btnStart_Click(object sender, EventArgs e)
25         {
26             //后台工作运行中,避免重入
27             if (bw.IsBusy) return;
28             bw.RunWorkerAsync("参数");//触发DoWork事件并异步执行,IsBusy置为True
29         }
30         //后台工作将异步执行
31         public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
32         {
33             //(string)e.Argument == "参数";
34             for (int i = 0; i <= 100; i++)
35             {
36  
37                 if (bw.CancellationPending)
38                 {//用户取消了工作
39                     e.Cancel = true;
40                     return;
41                 }
42                 else
43                 {
44                     bw.ReportProgress(i, "Working");//报告进度,触发ProgressChanged事件
45                     Thread.Sleep(10);//模拟工作
46                 }
47             }
48         }
49         //进度改变事件
50         public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
51         {
52             //(string)e.UserState=="Working"
53             progressBar1.Value = e.ProgressPercentage;//取得进度更新控件,不用Invoke了
54         }
55         //后台工作执行完毕,IsBusy置为False
56         public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
57         {
58             //e.Error == null 是否发生错误
59             //e.Cancelled 完成是由于取消还是正常完成
60         }
61  
62         private void btnCancel_Click(object sender, EventArgs e)
63         {
64             if (bw.IsBusy) bw.CancelAsync();//设置CancellationPending属性为True
65         }
66  
67     }
68 }
69 ————————————————
70 版权声明:本文为CSDN博主「AAA张绍山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
71 原文链接:https://blog.csdn.net/donowtop/article/details/79839597

 

有关BackgroundWorker用法示例的更多相关文章

  1. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  2. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  3. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  4. ruby - Google-api-ruby-client 翻译 API 示例 - 2

    很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

  5. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  6. ruby - 是否有 SproutCore 或 Cappuccino 的现场演示/示例应用程序 - 2

    在他们的网站上找不到任何内容。我主要只是想看看哪个值得一试(当然是RIA)。谢谢 最佳答案 SproutCoredemos 关于ruby-是否有SproutCore或Cappuccino的现场演示/示例应用程序,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1419788/

  7. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  8. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  9. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  10. ruby - 如何设置自动测试以仅重新运行失败的 rspec 示例 - 2

    我对自动测试的工作方式的印象(基于cucumbergithubwiki和其他在线内容)是它应该重新运行红色示例,直到它们通过。我的问题是它会重新运行规范文件中找到失败示例的所有示例,包括通过的示例。我不想浪费时间在修复失败示例的同时重新运行通过的示例。是否可以配置自动测试以便仅运行失败的示例? 最佳答案 您需要rspec-retrygem。以下是文档中有关如何实现它的一些示例:将它应用到覆盖整个测试套件的configureblock中...RSpec.configuredo|config|config.verbose_retry=t

随机推荐