后台运行之BackgroundWorker
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的更多相关文章
- Linux scp 设置nohup后台运行
Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...
- docker进入后台运行的容器
转载请注明出处 我们运行docker容器的时候,使用了-d参数,把容器在后台运行后. 这个时候,我们使用docker ps命令,我们就可以知道哪些程序在后台运行. 我们要怎么进入到docker ...
- python脚本后台运行
问题描述: 环境: CentOS6.4 一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本: python t ...
- linux 让程序在后台运行的几种可靠方法
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...
- linux进程后台运行及输出重定向
本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...
- APP长时间后台运行
* 参考:http://www.nivalxer.com/archives/187 首先,我要说明的是在iOS中,一般应用程序在后台挂起之后仅拥有3分钟时间来处理相应的未完成事件,但是3分钟之后就会 ...
- iOS开发小技巧--iOS程序进入后台运行的实现
iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...
- python程序一直在后台运行的解决办法
刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...
- tomcat 开机后台运行
引用:http://jingyan.baidu.com/article/a65957f4b12b8724e77f9b5a.html Tomcat是Apache 软件基金会(Apache Softwar ...
随机推荐
- javascript基础(一)变量
原文http://pij.robinqu.me/ 预定义的全局变量 arguments encodeURI Infinity Array encodeURIComponent isFinite Boo ...
- OSCache 使用
引入OSCache的jar包 package com.sun.utils; import java.util.Date; import com.opensymphony.oscache.base.Ne ...
- ResultSet 的Type属性 TYPE_FORWARD_ONLY, TYPE_SCROLL_I
说明:Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY ...
- LeetCode OJ 35. Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- java 内部类(摘抄自网络)
Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...
- 第三次冲刺spring会议(第四次会议)
[例会时间]2014/5/23 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇
- 【笔记】Loadrunner添加OS类型为Linux的服务器
参考文章:http://www.51testing.com/?uid-145985-action-spacelist-type-blog-itemtypeid-11954 在给Loadrunner添加 ...
- Unity3D 回合制 网上源码 目前还在研究构思
我们已将回合制的战斗模式讲解得很清楚了.那么,如果在Unity3D游戏中实现一个回合制游戏呢?我们从最简单的一对一模式来设计回合制游戏的原型.我们可以游戏的状态划分为下面三种状态: 1. ...
- 笨方法学python--提示别人
1 上次学到使用raw_input(), 还可以如下使用: age = raw_input("age?") 2 命令名查看raw_input的说明 unit, pydoc raw_ ...
- windows service and process 的关系
1.查询windows 对应的服务 sc query > 1.txt notepad 1.txt 2.查询对应的进程信息 tasklist /m > tasks.txt notepad t ...