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. javascript 中的 let 作用域

    let 声明了一个块级域的局部变量,并且可以给它一个初始化值. 语法EDIT let var1 [= value1] [, var2 [= value2]] [, ..., varN [= value ...

  2. [转]IntelliJ IDEA 使用心得与常用快捷键

    IntelliJ IDEA 使用心得与常用快捷键 那种酸爽,根本说不出来—————————————————————————— by: Jimi没有BondJimi是谁? 就是洒家啊! 刚开始学习写Ja ...

  3. Android moveTaskToBack(booleannon Root)

    moveTaskToBack (booleannon Root)方法:在activity中调用此方法即可将activity 退到后台,注意不是finish()退出. 参数说明: 参数为false--代 ...

  4. Windows Phone 十九、罗盘

    磁力计概述 拥有磁力计硬件支持的设备可以根据磁力计来确定相对于北极的角度 磁力计的访问 API 定义在 Compass 类中 调用方式和加速计类似 <Grid Background=" ...

  5. C#获取EF实体对象或自定义属性类的字段名称和值

    在年前上班的时候遇到了一个问题是这样描述的:我前台设计一个页面,是标签和文本框,当用户修改了哪个文本框的值,将该修改前的值.修改后的值,该值对应的字段,该值对应的行id获取到保存到数据库的某张表里.现 ...

  6. 提供一个表单,进行post数据处理

    var strContent = "aaaaa"; html.Append("<html><body><form id='postUploa ...

  7. 自定义子tabBar

    基本设置 设置APPIcon(直接拖图片) 设置启动图片 将launch Screen File里的LaunchScreen.xib给删掉 点击launch image source框内的Use As ...

  8. Maximo 7.5 集成方式 去掉主菜单

    最近有人在QQ中问我,在与portal集成时,客户不想显示maximo的主菜单,以前也有过朋友问过我这个问题,被我忽悠过去了,现在想起来,是不对的! 经过一翻查找,发现maximo有一个参数,port ...

  9. 关于dvajs里effects的call和put

    call会把return 传回来 put把参数穿回来了 在effects里好像只有yield能触发put ,call暂时没定

  10. 修改tnsnames.ora文件中配置内容中的连接别名后,连接超时解决办法

    1.tnsnames.ora文件中配置内容中的连接别名:由upaydb修改为IP地址 2.连接超时 定位原因: PLSQL登录界面的数据库列表就是读的tnsname.ora中连接的别名,这个文件中连接 ...