BackgroundWorker用法实例

自己的代码,就是要执行的代码写到dowork里,ProgressChanged事件是控制进度时用的,最后的Completed事件进度完成,也就是dowork里的代码执行完成了

public BackgroundWorker bgWork;

bgWork = new BackgroundWorker();
bgWork.WorkerReportsProgress = true;
bgWork.DoWork += new DoWorkEventHandler(bgWork_DoWork);
bgWork.ProgressChanged += new ProgressChangedEventHandler(bgWork_ProgressChanged);
bgWork.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWork_RunWorkerCompleted);
dp = new DownLoadProgress();
dp.progressBar1.Maximum = 1000;
dp.Show();

void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

try

{

dp.lb_dw.Visible = true;

dp.Close();

if (e.Error != null)

{

MessageBox.Show("升级失败" + e.Error.Message);

}

else if (e.Result != null && e.Result.Equals(false))

{

}

else

{

if (TZSys.Common.SysUpdate.Update.SysUpdate.PerUpdate(AppDomain.CurrentDomain.BaseDirectory + "update\\"))

{

#region 升级数据库

List<string> sqlstr = new List<string>();

string[] files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + "update\\");

foreach (string file in files)

{

if (file == AppDomain.CurrentDomain.BaseDirectory + "update\\"+"sql.txt")

{

using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "update\\sql.txt", FileMode.Open, FileAccess.Read))                                 {

StreamReader sr = new StreamReader(fs);

while (sr.Peek()>=0)

{

sqlstr.Add(sr.ReadLine());

}

sr.Close();

fs.Close();

}

}

}

if (sqlstr.Count > 0)

{

string datapath = AppDomain.CurrentDomain.BaseDirectory + "Data";

string[] directorys = Directory.GetDirectories(datapath);

if (directorys.Length > 0)

{

foreach (string database in directorys)

{

string[] str = database.Split('\\');

string path = database + "\\" + str[str.Length-1]+".DB";

SqlOper sql = new SqlOper();

sql.DealSql(path, sqlstr);

}

}

File.Delete(AppDomain.CurrentDomain.BaseDirectory + "update\\" + "sql.txt");

}

#endregion

if (TZSys.Common.SysUpdate.Update.SysUpdate.StartUpdate(AppDomain.CurrentDomain.BaseDirectory + "update\\"))

{

//保存升级后的版本号

XmlDocument xml = new XmlDocument();

xml.Load(BlackBoard.DirectoryCurrent + "XML\\update.XML");

if (upcmid != "" && upmainid!="")

{

xml.GetElementsByTagName("cmpid")[0].InnerText = upcmid;

xml.GetElementsByTagName("mainid")[0].InnerText = upmainid;

xml.Save(BlackBoard.DirectoryCurrent + "XML\\update.XML");

}

if (MessageBox.Show("升级成功,是否重新启动", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

if (File.Exists(BlackBoard.DirectoryCurrent + "SysUpdate.dll"))

File.Delete(BlackBoard.DirectoryCurrent + "SysUpdate.dll");

Application.Exit();

Process myProcess = new Process();

//string fileName = "ServiceClientIMForm.exe";startexe

string fileName = startexe;

ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(fileName);

myProcess.StartInfo = myProcessStartInfo;

myProcess.Start();

//Environment.Exit(0);

}

}

}

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

   //基本不用动

void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

dp.progressBar1.Value = e.ProgressPercentage;

}

void bgWork_DoWork(object sender, DoWorkEventArgs e)

{

BackgroundWorker bw = (BackgroundWorker)sender;

try

{

if (!e.Argument.ToString().Contains(".zip"))

{

MessageBox.Show("更新包不是.zip文件,无法下载");

e.Result = false;

}

else if (!AppendDownLoad(e.Argument.ToString().Split('@')[0], e.Argument.ToString().Split('@')[1], bw))

{

MessageBox.Show("下载失败");

e.Result = false;

}

}

catch (Exception ex)

{

MessageBox.Show("下载失败" + ex.Message);

}

}

//BackgroundWorker的调用方法

public void DownloadFile(string url, string fileName)

{

fileName = DirPath + "\\" + fileName;

DFileName = fileName;

bgWork.RunWorkerAsync(url + "@" + fileName);//里面是参数是bgWork_DoWork事件的e.Argument

}

winform异步系统升级—BackgroundWorker的更多相关文章

  1. winform异步进度条LongTime

    winform异步进度条LongTime,运用到回调函数 定义事件的参数类: namespace LongTime.Business { // 定义事件的参数类 public class ValueE ...

  2. WinForm中使用BackgroundWorker异步加载数据并使用进度条

    在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...

  3. C# 使用BackgroundWorker实现WinForm异步

    写了一个基于BackgorundWorker演示异步操作的例子.由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动.操作结束后的回调.异步操作的撤销和进度报告等等.尽管 ...

  4. 实现 winform 异步跨线程访问UI控件

    在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...

  5. 一个简单的webservice的demo(下)winform异步调用webservice

    绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...

  6. 1 Winform 异步更新控件

    刚才看到有人问为了winfrom中,在大数据绑定的时候出现画面假死的状态,为了解决这个问题希望通过再开一个线程来给控件绑定数据,可是画面还是会假死.现在看到的方法有1.掩耳盗铃法(Control.Ch ...

  7. 基于事件的异步模式——BackgroundWorker

    实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...

  8. Winform中设置BackgroundWorker在取消时关闭后台进程

    场景 在Winform中拖拽 一个BackgroundWorker控件,配合进度条控件能开启一个后台线程并报告进度条进度. 但是在执行后台线程的任务时,如果想要取消,怎样让其停止执行. 注: 博客主页 ...

  9. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

随机推荐

  1. Android 广播 BroadcastReceiver

    Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播.当然用户也可以自定义自己的广播. 既然说到广播,那么必定有一个广播发送者,以及广播接收器 ...

  2. BufferedReader与Scanner的区别

    在Java中,我们都知道Java的标准输入串是System.in.但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等.而System.in提供的read方法 ...

  3. kindEditor完整认识 PHP上调用并上传图片说明/////////////////////////////z

      最近又重新捣鼓了下kindeditor,之前写的一篇文章http://hi.baidu.com/yanghbmail/blog/item/c681be015755160b1d9583e7.html ...

  4. objective-c第七章课后练习2

    题:改变第七章例子中print方法,增加bool参数,判断如果是YES则对分数进行约简 @interface Fraction : NSObject { //int num,den; } @prope ...

  5. JsonUtil工具类

    package comm; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collec ...

  6. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  7. Excel 导入 导出 Microsoft

    导出: private void exportExcel() { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { Application. ...

  8. 将HTML5封装成android应用APK文件的几种方法(转载)

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  9. CentOS7安装ftp服务器

    一.问题的提出 想在windows环境下远程连接CentOS的文件并编辑 二.问题的解决 # 安装vsftp服务[root@localhost ~]# yum -y install ftp vsftp ...

  10. Global.asax文件说明

    Global.asax是我们的底层文件,第一次的IIS请求都会先去执行它里面的文件,所以学会它里面的函数是非常有必要的.而且我们总是忽略这里的知识点,总觉得这是不必须的,其实我们错了,这里才是程序的根 ...