首先在窗体拖入一个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. CMap与hash_map效率对照

    CMap与hash_map底层均採用hash stable实现,CMap是MFC提供的模板类.hash_map尽管眼下并未纳入C++标准模板类库,但差点儿每一个版本号的STL都提供了对应的实现.CMa ...

  2. IIS ASP.NET 版本转换批处理代码

    原文 IIS ASP.NET 版本转换批处理代码 用来转换asp.net版本的代码,需要的朋友可以参考下. 标识符的查看方法:iisaspnet.bat代码 复制代码代码如下: @echo off e ...

  3. Android IPC通信和AIDL技术应用

    首先我们了解一下 IPC和AIDL IPC:进程间通信 AIDL:Android Interface Definition Language,即Android接口定义语言. 为什么使用: Androi ...

  4. MYSQL 优化指南

    数据库设计原则   标准化和规范化 数据库设计范式(3NF)   第一范式 数据属性唯一标示 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关 ...

  5. Oracle中使用Entity Framework 6.x Code-First

    Oracle中使用Entity Framework 6.x Code-First方式开发 去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下O ...

  6. polay定理总结

    参考资料:url=YveSCnlx_dlXo4oGjE8w3_2QRObRXvXMbix81ppCxBGqBswxffwDN9frzY5xxaKf7GgEMY8K93JTPEhkBzY66XOaN0G ...

  7. 第5章 原型模式(Protype Pattern)

    原文 第5章 原型模式(Protype Pattern) 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Pro ...

  8. GCD(1222)Wolf and Rabbit

    Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...

  9. ORACLE11G RAC 施加以分离不同的实例.TAF

    有套POS制 现在应用大量的,大量的数据,! 年前的交易在一定程度上的统计分析影响了额外的应用程序. 这两种应用分别OLTP和OLAP. 其实很多本项目具有的应用要求双方.  看了很多近期的其他系统, ...

  10. CQRS 示例

    CQRS 示例 上一篇:<IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)> 学习架构知识,需要有一些功底和经验,要不然你会和我一样吃力,CQRS.EDA ...