首先在窗体拖入一个BackgroundWorker组件,根据功能需要设置BackgroundWorker的属性

WorkerSupportsCancellation = true; 允许取消后台正在执行的操作

WorkerReportsProgress = true;  允许显示后台操作的执行进度(主要作用是与主窗体交互,解决了“不允许跨线程访问控件”之类的错误)

 

1、开始执行后台操作

在执行后台操作的地方调用BackgroundWorker组件的RunWorkerAsync()方法,该方法执行时会触发BackgroundWorker组件的DoWork 事件。所以接下来添加BackgroundWorker组件的DoWork 事件,在事件中写要实现的后台操作代码即可。比如

private void button1_Click(object sender, EventArgs e)
{
    bgWork.RunWorkerAsync(); //调用方法,触发DoWork事件
}

private void bgWork_DoWork(object sender, DoWorkEventArgs e)
{
    //在此实现后台操作代码
}

2、取消正在执行的后台操作

在取消后台操作的地方调用BackgroundWorker组件的CancelAsync()方法,然后在DoWork事件判断BackgroundWorker组件的后台操作状态,即BackgroundWorker组件的CancellationPending属性。

private void btnCancel_Click(object sender, EventArgs e)
{
    bgWork.CancelAsync();
}

private void bgWork_DoWork(object sender, DoWorkEventArgs e)
{
    if (bgWork.CancellationPending)
    {
        Thread.Sleep();
        //这里实现回滚操作
        e.Cancel = true;
    }
    else
    {
        Thread.Sleep();
        //这里实现后台操作
    }
}

3、主窗体界面显示后台操作状态或进度

在DoWork事件的后台操作代码最后调用BackgroundWorker组件的ReportProgress()方法。该方法被执行是会触发BackgroundWorker组件的ProgressChanged事件,在该事件中可以操作主窗体控件。

private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    label1.Text = e.UserState;  //第一个参数
    progressBar1.Value = e.ProgressPercentage; //第二个参数
}

private void bgWork_DoWork(object sender, DoWorkEventArgs e)
{
    ; i < ; i++)
    {
        if (bgWork.CancellationPending)
        {
            ; k--)
             {
                 Thread.Sleep();
                  //这里实现回滚操作
                  bgWork.ReportProgress(k, "正在收回数据");
             }
             e.Cancel = true;
             return;
        }
        else
        {
            Thread.Sleep();
            //这里执行后台操作
            bgWork.ReportProgress(i, "正在录入数据");
        }
    }
}

4、后台操作结束后提示信息。

当后台操作结束后,会触发BackgroundWorker组件的RunWorkerCompleted事件

private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("当前操作被取消!");
    }
    else
    {
        MessageBox.Show("操作完成!");
    }
}

参考:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html

参考:http://www.cnblogs.com/chenxizhang/archive/2010/03/13/1685209.html

BackgroundWorker组件使用总结的更多相关文章

  1. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  2. BackgroundWorker组件

    BackgroundWorker组件封装了后台线程的操作,并且直接利用线程池,无需自己管理线程池等复杂问题. 它主要适用于 比如界面后台加载数据,进度显示,上传下载文件,日月结等 这些都是繁重的劳动, ...

  3. BackgroundWorker组件学习

    今天看到别人的博客中提到了BackgroundWorker组件.在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看.今天凑巧看到了一个关于BackgroundWorker ...

  4. backgroundworker组件的使用

    本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html BackgroundWorker 组件用来执行诸如数据库事务. ...

  5. 使用BackgroundWorker组件进行异步操作编程

    本文介绍了BackgroundWorker组件的功能及在基于事件的异步操作编程中的应用,并对组件的实现原理进行简述.在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载.复杂计算及数据库事务等 ...

  6. C# BackgroundWorker组件学习

    C# BackgroundWorker组件学习  C# BackgroundWorker组件学习 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用Ba ...

  7. C# Winform backgroundWorker组件使用

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  8. 使用BackgroundWorker组件

    BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...

  9. BackGroundWorker组件使用、Winform控件的Invoke安全调用

    BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作. 可以通过编程方式创建 BackgroundWorker,也可以将它从"工具 ...

随机推荐

  1. 自制Https证书并在Spring Boot和Nginx中使用(转)

    白话Https一文中, 介绍了Https存在的目的和工作原理,但多是偏向于原理性的介绍,本文介绍如何一步一步自制一个能够通过浏览器认证的Https证书,并讲解在Spring Boot环境和Nginx环 ...

  2. Linux设备驱动实现自己主动创建设备节点

    #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #inclu ...

  3. Cisco笔试——2014年

    笔试时间:11月1日(周六)下午13:00-14:10 申请者考场地点:上海市徐汇区梅陇路130号华东理工大学徐汇校区第六教学楼六大 我报的思科的软件开发software,属于(常规) 一共70多道题 ...

  4. 从头学起android&lt;android基本的绘图.四十六.&gt;

    在一般的图形渲染用户通常只需要重写onDraw()该方法可以是.但是假设,才能真正完成绘图操作.此外,我们需要掌握的四大核心经营类: android.graphics.Bitmap:主要表示的是一个图 ...

  5. AngularJS与ASP.NET MVC登录超时解决方案

    问题: 1.在Action中判断Ajax请求的方法Request.IsAjaxRequest()始终是false 2.返回给前台StatusCode和HttpUnauthorizedResult,前台 ...

  6. Hbase在的应用经验的统计

    1. 需求统计 互联网上对于数据的统计,一个重要的应用就是对站点站点数据的统计,比如CNZZ站长统计.百度统计.Google Analytics.量子恒道统计等等. 站点站点统计工具无外乎有下面一些功 ...

  7. 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法(Naive Bayes) 阅读目录 一.病人分类的例子 二.朴素贝叶斯分类器的公式 三.账号分类的例子 四.性别分类的例子 生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本 ...

  8. Sharepoint 2013 左右&quot;SPChange&quot;一个简短的引论

    于SharePoint于,我们经常需要获得这些更改项目,竟api为我们提供SPChange物.下列,在通过我们的目录资料这一目标. 1.创建测试列表,名字叫做"SPChangeItems&q ...

  9. 1006-HBase操作实战(JAVA API状态)

    一.准备阶段 开发环境: hadoop: hadoop -2.4.0 hbase: hbase -0.94.11-security eclipse:Juno Service Release 2 二.创 ...

  10. 私人定制javascript中对象小知识点(Only For Me)

    废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说 ...