首先在窗体拖入一个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. java NIO中的Reactor相关知识汇总 (转)

    一.引子 nio是java的IO框架里边十分重要的一部分内容,其最核心的就是提供了非阻塞IO的处理方式,最典型的应用场景就是处理网络连接.很多同学提起nio都能说起一二,但是细究其背后的原理.思想往往 ...

  2. Ajax实践之用户是否存在

    关于Ajax在之前的学习中,已经对它的基础知识有了初步的了解.仅仅是欠实践. 那么接下来就让实践来检验一下真理吧! 基础见:http://blog.csdn.net/liu_yujie2011com/ ...

  3. 使用HttpURLConnection向服务器发送post和get请求(转)

    一.使用HttpURLConnection向服务器发送get请求 1.向服务器发送get请求 @Test publicvoid sendSms() throws Exception{ String m ...

  4. RabbitMQ (两)工作队列

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37620057 本系列教程主要来自于官网新手教程的翻译,然后自己进行了部分的改动与 ...

  5. asp.net学习之SqlDataSource

    原文:asp.net学习之SqlDataSource 通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据.其中可以包括 Microsoft SQL Serv ...

  6. C# Windows Schedule task此次收购task下一步执行时间

    最近进行了一次需求和Windows Schedule task相关职能,通过schedule,计算下一次运行task时间. 它用于由第三方DLL实现,以下网站,以下载来自: http://tasksc ...

  7. Oracle 用户权限管理方法

    Oracle 用户权限管理方法 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最 ...

  8. SSIS从理论到实战,再到应用(1)----创建自己的第一个包

    原文:SSIS从理论到实战,再到应用(1)----创建自己的第一个包 其实,如果你使用sql2008的导出导入工具的时候,你就已经在使用包了. 目标:使用sql2008 导入导出工具,导入excel数 ...

  9. 20天android学习

    20多天的实习(事实上,一个人学习的东西)要结束, 其余的都只有读研. 此20许多天,我学到了很多东西, 至android的发展也有一定的了解.之后写这篇文章主要是完成研究可以学得很快再次回升 1.安 ...

  10. 【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!

    原文:[百度地图API]发布静态图API啦!只需一个网址,即可展示定制百度地图! 摘要: 百度地图静态图API!您无须执行任何“特殊”操作便可在网页上显示此图片. 不需要 JavaScript.我们只 ...