BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

一、BackgroundWorker 相关生命周期

1.声明BackgroundWorker

2.设置相关操作事件和属性,并开始这个对象

3.执行设置事件(DoWork事件为耗时操作,耗时操作时反馈给UI界面的ProgressChanged事件(Dowork的报告方法引发),

完成DoWork时执行RunWorkerCompleted方法)

4.写相关事件

比如导出excel

1.点击时事件

       /// <summary>
/// 将数据库数据转换为excel操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DbToExcel(object sender, RoutedEventArgs e)
{ BackgroundWorker bw = new BackgroundWorker(); //创建一个BackgroundWorker线程
bw.WorkerReportsProgress = true; //设置BackgroundWorker可以进行报告更新
bw.DoWork += new DoWorkEventHandler(toExcel); //执行耗时操作 创建一个DoWork事件,并进行报告,指定bw_DoWork方法去做事
bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); //通过报告(数据),进行对UI操作
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); //完成操作时响应事件
PartPosition = null;
bw.RunWorkerAsync("my url");//开始执行DoWork事件 并传递一个对象
}

2.BackgroundWorker 需要执行的事件

       void toExcel(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = (BackgroundWorker)sender;
string url = e.Argument.ToString(); DataTable tableData = ProductMananger.getAllPositionList(); #region 插入数据 foreach (DataRow row in tableData.Rows)
{
//没有取消后台操作
if (!bw.CancellationPending)
{
//报告
bw.ReportProgress((int)((double)(rowIndex - ) / RowCount * ), i);
}
} }
} private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//progressBar1.Value = e.ProgressPercentage;
//label1.Text = e.UserState.ToString(); 这个是一个对象
this.progressText.Text = e.ProgressPercentage+"%";
this.progressbar_Excel.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("ok!");
}

如果不这样可以如下:

Dispatcher.Invoke(new Action(() =>
{
this.progressText.Text = (int)(Value / Maximum * ) + "%";
this.progressbar_Excel.Value = Value;
}));

参考

http://www.cnblogs.com/zhouzangood/articles/3638117.html

后台运行之BackgroundWorker的更多相关文章

  1. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

  2. docker进入后台运行的容器

    转载请注明出处   我们运行docker容器的时候,使用了-d参数,把容器在后台运行后. 这个时候,我们使用docker ps命令,我们就可以知道哪些程序在后台运行.   我们要怎么进入到docker ...

  3. python脚本后台运行

    问题描述: 环境: CentOS6.4 一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本: python t ...

  4. linux 让程序在后台运行的几种可靠方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  5. linux进程后台运行及输出重定向

    本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...

  6. APP长时间后台运行

    *  参考:http://www.nivalxer.com/archives/187 首先,我要说明的是在iOS中,一般应用程序在后台挂起之后仅拥有3分钟时间来处理相应的未完成事件,但是3分钟之后就会 ...

  7. iOS开发小技巧--iOS程序进入后台运行的实现

    iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...

  8. python程序一直在后台运行的解决办法

    刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...

  9. tomcat 开机后台运行

    引用:http://jingyan.baidu.com/article/a65957f4b12b8724e77f9b5a.html Tomcat是Apache 软件基金会(Apache Softwar ...

随机推荐

  1. dplyr 数据操作 统计描述(summarise)

    在R中,summary()是一个基础包中的重要统计描述函数,同样的在dplyr中summarise()函数也可以对数据进行统计描述. 不同的是summarise()更加的灵活多变,下面来看下summa ...

  2. hdu_5950_Recursive sequence(矩阵快速幂)

    题目链接:hdu_5950_Recursive sequence 题意:递推求解:F(n) = 2*F(n-2) + F(n-1) + n4 和F(1) = a,F(2) = b: 题解: 一看数据范 ...

  3. hdu_5821_Ball(贪心)

    题目链接:hdu_5821_Ball 题意: 给你序列A和序列B,依次给你m个区间,每次你可以交换区间内的任意数,问最后能不能将A变成B 题解: 比赛当时没想到,智商被压制 1001: 假设有4个红球 ...

  4. Python之迭代器&装饰器&生成器&正则

    1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数 ...

  5. Linux目录结构及快捷键

    1.树形目录结构 2.最顶层:根目录 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动配置文件和脚本 /home 用户主目录的基点 /lib ...

  6. cmusphinx格式问题

    在windows下.lm和.dict同时为ANSI编码,输出正确,否则输出乱码或不输出结果.

  7. javascript中onSubmit="return xxx()"的问题

    javascript中onSubmit="return xxx()"刚开始我是想不通为什么要加return在里面呢,后来想想onSubmit="flase"就不 ...

  8. 运行CImg库笔记

    1. 在程序代码中加入 #include "CImg.h" using namespace cimg_library; 2. (1)Mac下 出现错误“无X11/Xlib.h”,: ...

  9. 什么是JDBC?

    JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力! 1.方式一(配置文件实现): <!-- 1. 连接池实例 --&g ...

  10. 5. JavaScript 正则表达式

    1. 概念 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式. 2. 使用字符串 ...