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. Bullet_Point_Py

    1. if __name__ == "__main__" Term: 模块最高级的代码:模块中没有缩进的代码 Principal 1: 第一次导入模块会执行模块最高级的代码.不管你 ...

  2. CentOS postgresql9.4

    yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1.noarch.rpm Once t ...

  3. JAVASCRIPT 框架>>

    jQuery jQueryjQuery 是目前最受欢迎的 JavaScript 框架 jQuery 是为处理 HTML 事件而特别设计的<script type="text/javas ...

  4. HDU 1509 Windows Message Queue(队列)

    题目链接 Problem Description Message queue is the basic fundamental of windows system. For each process, ...

  5. PHP中使用CURL(一)

    执行流程: curl_init()初始化 -> curl_setopt()设置变量 -> curl_exec()获取结果 -> curl_close()释放句柄 Get: $ch = ...

  6. 利用scrollTop 制作图片无缝滚动

    <!doctype html><title>javascript无缝滚动 by 司徒正美</title><meta charset="utf-8&q ...

  7. onmousedown活用之碰撞效果

    通过绝对定位,在页面中随意位置设置两个div; 也就是说div 是拖动的框,div1和div2是被触碰的框; <!DOCTYPE html> <html> <head&g ...

  8. 【开发笔记】Spring的配置文件

    factory-method竟然写成了destroy-method,害得我运行报错,找原因找了几分钟. 原来我按alt+/来提示代码的时候,有许多可选项,可能一时眼花选错了

  9. Centos6.6安装Nginx

    1.在安装nginx之前,需要先安装该模块需要依赖包 yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel 2.安 ...

  10. AutoTile 自动拼接 番外篇(自动融合技术)

    http://pan.baidu.com/s/1dDQyfSl 密码:ttud 先睹为快吧. 之后 还差一个 智能替换 技术.