×

backgroundworker round 异步

backgroundworker(如何使用backgroundWorker进行异步操作)

admin admin 发表于2022-09-07 23:17:54 浏览86 评论0

抢沙发发表评论

本文目录

如何使用backgroundWorker进行异步操作


组件介绍
BackgroundWorker类位于System.ComponentModel 命名空间中,通过该类在单独的线程上执行操作实现基于事件的异步模式。下面对BackgroundWorker类的主要成员进行介绍。
BackgroundWorker类的第1个主要方法是RunWorkerAsync,该方法提交一个以异步方式启动运行操作的请求,发出请求后,将引发 DoWork 事件,在事件处理程序中开始执行异步操作代码。RunWorkerAsync 方法签名如下,
publicvoidRunWorkerAsync();

publicvoidRunWorkerAsync(Object argument);
如果异步操作需要操作参数,可以将其作为argument参数提供,由于参数类型为Object,因此访问时可能需要进行类型转换。
CancelAsync 方
法提交终止异步操作的请求,并将 CancellationPending 属性设置为 true。需要注意的是,CancelAsync
方法是否调用成功,同WorkerSupportsCancellation
属性相关,如果允许取消执行的异步操作,需将WorkerSupportsCancellation
属性设置为true,否则调用该方法将抛出异常。CancelAsync方法不含参数,方法签名如下,
publicvoid CancelAsync();
调用 CancelAsync
方法时,BackgroundWorker的 CancellationPending
属性值将被设置为true,因此在编写单独线程中执行的辅助方法时,代码中应定期检查 CancellationPending
属性,查看是否已将该属性设置为 true,如果为true,应该结束辅助方法的执行。有一点需要注意的是,DoWork
事件处理程序中的代码有可能在发出取消请求时已经完成处理工作,因此,DoWork事件处理程序或辅助方法可能会错过设置
CancellationPending属性为true的时机。在这种情况下,即使调用
CancelAsync方法发出了取消异步操作请求,RunWorkerCompleted
事件处理程序中RunWorkerCompletedEventArgs 参数的 Cancelled 标志也不会被设置为
true,这是在多线程编程中经常会出现的竞争条件问题,因此编写代码的时候需要考虑。
在执行异步操作时,如果需要跟踪异步操作执行进度,BackgroundWorker类提供了 ReportProgress 方法,调用该方法将引发 ProgressChanged 事件,通过注册该事件在事件处理程序中获取异步执行进度信息。方法签名如下:
publicvoidReportProgress(int percentProgress);

publicvoidReportProgress(int percentProgress,Object userState);
该方法包含两个版本,percentProgress表示进度百分比,取值为0-100,userState为可选参数表示自定义用户状态。
同CancelAsync 方法一样,BackgroundWorker的WorkerReportsProgress 属性设置为 true时,ReportProgress 方法才会调用成功,否则将引发InvalidOperationException异常。
上面已经提到了
BackgroundWorker的3个属性,CancellationPending用来提示操作是否已经取
消,WorkerReportsProgress和WorkerSupportsCancellation分别用来设置是否允许进度汇报和进行取消操作。
publicboolCancellationPending { get; }

publicboolWorkerReportsProgress { get; set; }

publicboolWorkerSupportsCancellation { get; set; }
另外一个会用到的属性是IsBusy,
publicbool IsBusy { get; }
通过该属性查询BackgroundWorker实例是否正在运行异步操作,如果 BackgroundWorker 正在运行异步操作,则为true,否则为false。
BackgroundWorker类包含3个事件,在事件处理程序中可进行异步操作辅助代码编写和同用户界面信息交互。
publiceventDoWorkEventHandler DoWork;

publiceventProgressChangedEventHandler ProgressChanged;

publiceventRunWorkerCompletedEventHandler RunWorkerCompleted;
DoWork事
件处理程序用来调用辅助方法进行实际处理操作,由于该事件处理程序在不同于UI的线程上执行,因此需要确保在 DoWork
事件处理程序中不操作任何用户界面对象。如果辅助方法需要参数支持,可以通过RunWorkerAsync方法传入,在 DoWork
事件处理程序中,通过 DoWorkEventArgs.Argument 属性提取该参数。在异步操作期间,可以通过
ProgressChanged事件处理程序获取异步操作进度信息,通过RunWorkerCompleted
事件处理程序获取异步操作结果信息,在ProgressChanged和RunWorkerCompleted的事件处理程序中可以安全的同用户界面进行
通信。
应用示例
下面通过一个简单的示例来演示BackgroundWorker组件的典型应用。在本示例中,实现一个数值的求和操作,该操作本身运行很快,为模拟处理过程有一个可感知的时间段,在辅助方法中调用了Thread.Sleep方法。
示例程序通过Windows Forms展示,显示了对1-100的数值进行求和操作,界面如下,
图1:应用程序界面
下面对主要实现代码进行说明,先看一下BackgroundWorker类的初始化,在初始化过程中注册了3个事件,允许异步辅助方法调用,以及异步操作进度通知和操作取消。
private System.ComponentModel.BackgroundWorker backgroundWorker1;

private void InitializeBackgoundWorker()

{

this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();

this.backgroundWorker1.WorkerReportsProgress = true;

this.backgroundWorker1.WorkerSupportsCancellation = true;

this.backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

}
通过StartAsync按钮事件处理程序开始异步处理操作请求,事件处理程序如下,
private void startAsyncButton_Click(object sender, EventArgs e)

{

resultLabel.Text = String.Empty;

this.numericUpDown1.Enabled = false;

this.startAsyncButton.Enabled = false;

this.cancelAsyncButton.Enabled = true;

//获取计算数值.

int numberToCompute = (int)numericUpDown1.Value;

//启动异步操作.

backgroundWorker1.RunWorkerAsync(numberToCompute);

}
startAsyncButton_Click处理程序首先对一些界面控件进行状态设置,然后调用BackgroundWorker实例的RunWorkerAsync方法开始执行异步操作,而此时就会触发DoWork事件。
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

{

BackgroundWorker worker = sender as BackgroundWorker;

e.Result = ComputeAdd((int)e.Argument, worker, e);

}
在DoWork事件处理程序中,通过DoWorkEventArgs.Argument属
性获取传入的参数传递给ComputeAdd辅助方法,并把处理结果保存到DoWorkEventArgs.Result属性中,最后在
RunWorkerCompleted 事件处理程序的RunWorkerCompletedEventArgs.Result
属性中获取处理结果。如果在DoWork事件处理程序中出现异常,则 BackgroundWorker 将捕获该异常并将其传递到
RunWorkerCompleted 事件处理程序,在该事件处理程序中,异常信息作为 RunWorkerCompletedEventArgs 的
Error 属性公开。
private long ComputeAdd(int n, BackgroundWorker worker, DoWorkEventArgs e)

{

long result = 0;

for (int i = 1; i 《= n; i++)

{

if (worker.CancellationPending)

{

e.Cancel = true;

break;

}

else

{

result += i;

Thread.Sleep(500);

int percentComplete = (int)((float)i / (float)n * 100);

worker.ReportProgress(percentComplete);

}

}

return result;

}
在辅助方法中,代码定期访问BackgroundWorker实
例的CancellationPending属性,如果调用了BackgroundWorker的CancelAsync
方法,那么CancellationPending属性值就会被设置为true,辅助方法就结束执行。另外,在辅助方法中实现了进度汇报功能,通过调用
worker.ReportProgress方法触发ProgressChanged事件,接着通过ProgressChanged事件处理程序来更新进
度显示。
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

this.progressBar1.Value = e.ProgressPercentage;

}
最后,在
RunWorkerCompleted事件处理程序中可以得到异步处理结果信息,分析异步操作是正常执行结束还是在处理中被取消或者是执行出现错误异常而
终止。对于处理结果信息的访问有一个标准的顺序,先是判断异步处理是否异常结束,接着判断是否执行了取消操作,最后访问处理结果。
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if (e.Error != null)

{

MessageBox.Show(e.Error.Message);

}

else if (e.Cancelled)

{

resultLabel.Text = “Canceled“;

}

else

{

resultLabel.Text = e.Result.ToString();

}

this.numericUpDown1.Enabled = true;

startAsyncButton.Enabled = true;

cancelAsyncButton.Enabled = false;

}

BackgroundWorker代码如何执行


楼主你的代码不是c#的,是不是vb的?你发错了分类。
而且这应该你是程序逻辑的问题。按照你代码的逻辑,只要那个BackgroundWorker1
是正常运行的你的代码就是个死循环。只有运行出了问题才不会继续执行下去。你要明确一点就是你想要做什么,不要拿来别人的代码就生硬的搬上去。
如果想得到stop哪一步,可以加一个变量,比如int类型的i,初始值设0,while循环每执行一次就让i加1,当i等于100就跳出循环,可能是用break关键字,vb我不太熟悉你自己查一下。

c# 窗体backgroundworker


backgroundworker 是一个后面线程。当然也是可以自己声明个线程来处理。

不管理你是使用backgroundworker 或者线程都要正开启执行才能正常使用。

你用   backgroundWorker1时如下:

    backgroundWorker1.RunWorkerAsync();//开始执行后台操作。这样你的

backgroundworker线程才能正常使用

      public Form1()
        {
            
            InitializeComponent();
            backgroundWorker1.RunWorkerAsync();
        }
          flag==1;
     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
         while (flag_read==1) 
              {
              }
        }
-异步

BackgroundWorker怎么传递参数


当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程,大致的步骤是: 1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数)
-round

BACKGROUNDWORKER的用法


* 作者:周公
* BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。
* 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
* 它有几个属性:
* CancellationPending——指示应用程序是否已请求取消后台操作。
* IsBusy——指示 BackgroundWorker 是否正在运行异步操作
* WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新
* WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消
* 还有如下事件:
* DoWork——调用 RunWorkerAsync 时发生。
* ProgressChanged——调用 ReportProgress 时发生。
* RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
*
* 还有如下方法:
* CancelAsync——请求取消挂起的后台操作
* ReportProgress——引发 ProgressChanged 事件
* RunWorkerAsync——开始执行后台操作
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/zhoufoxcn/archive/2007/10/19/1832819.aspx
-异步

winform怎么使用后台处理控件backgroundworker


方法/步骤
1
在winform项目中,打开工具箱,找到backgroundworker控件并拖入窗体中,这时窗体下方出现backgroundworker实例
2
右击backgroundworker实例,在菜单中选择“属性”
3
在属性窗口中,点击闪电按钮切换到控件的事件列表
4
分别在DoWork 和RunWorkerCompleted的属性处双击来生成绑定事件,可以看到后台自动生成了事件签名
5
为了调用backgroundworker控件,在窗口中拖入一个按钮。另外,拖入一个label来显示结果
6
双击按钮,进入后台代码。在单击事件写上测试代码,如下图所示。其中,
label1.Text = “start“;表明后台处理开始
backgroundWorker1.RunWorkerAsync();调用backgroundWorker1
7
为了模拟复杂费时间的处理,在Dowork事件中加入如下代码,代码含义是:循环5次,每次暂停1秒钟,总共暂停5秒钟。
for (int i = 0; i 《 5; i++)
{
Thread.Sleep(1000);
}
在RunWorkerCompleted事件中加入如下代码,代码含义是:复杂费时间的处理完成后,给出提示。
label1.Text = “finish“;
8
运行工程,测试效果。点击按钮,label的内容变成start,这时等上5秒钟,label的内容变成finish,测试成功
http://jingyan.baidu.com/article/86f4a73e7c7b5537d7526976.html
-round

backgroundworker的使用和与thread的区别


  backgroundworker与thread的区别如下:

  1、BackgroundWorker在内部封装了线程。所以你创建了一个BackgroundWorker,就相当于创建一个线程,并且提供一个方法做为任务由它去执行。 

  2、在WINDWOS桌面程序中使用线程时,常常会遇到需要跨线程访问线程的情况,因为WINDOWS的界面控件都不是线程安全的,所以不能直接跨线程访问。

  3、使用BackgroundWorker时,处理进度显示量容易。

  4、当你执行的任务较简单,不需要复杂控制时使用BackgroundWorker,较为方便;当你要执行的任务需要复杂控制(如线程同步)时,要自己 创建线程。

  

c# backgroundWorker的用法:


(s, e) =》{};   是一个匿名委托

匿名委托——为事件(event)注册匿名委托 - 草青工作室 的专栏 - 博客频道 - CSDN.NET

bgw.DoWork +=bgw_DoWork;//放到相应过程中

bgw_DoWork(object e,,DoWorkEventArgs e){
}

BackgroundWorker 类 (System.ComponentModel)-异步

https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx


c#backgroundworker怎么终止


终止BackgroundWorker,其实就是取消正在运行的后台操作。为此,执行以下步骤:
1)首先要把BackgroundWorker.WorkerSupportsCancellation属性的值设置为true
2)接着调用CancelAsync()方法
3)检查BackgroundWorker.CancellationPending 属性,判断后台异步操作是否被真正取消。
======
终止后台操作之所以这么繁琐,是因为后台操作是以异步方式运行在后台线程上的。
-round

C#中 BackGroundWorker与Thread的区别


使用Thread ,在多线程编程中经常需要在线程间共享资源。例如,多个线程可能需要访问一个共享数据库,或对一组系统变量进行更新。当多个线程同时竞争共享资源的访问权时,就可能会出现“争用状态”。您可以通过使用“锁”来保护代码的关键部分免受争用状态的损坏。当然这需要通过细致的手动编码来实现.
在.NET Framework 2.0中 BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能,简化了面向用户的编码难度,可以很好的帮你处理多线程间的调度,保护等方面的问题,通过提供面向对象的线程模型来使您能够快速、方便地创建多线程应用程序。
对于对线程开发, 需要注意:是否使用lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断,是否及时的创建和终止线程,是否使用线程池来管理每一个线程,此外,简单的创建及销毁线程的测试程序是不足以说明该技术的实际应用的.
-异步