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. UISegmentedControl 的使用

    /** 设置选择器 */ - (void)setUpSegmentCtr { UISegmentedControl *segmentCtr = [[UISegmentedControl alloc] ...

  2. 查看 Apache并发请求数及其TCP连接状态

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...

  3. (一)Nand FLASH 原理讲解

    NAND FLASH  优势 : 可以用当硬盘   这里好像型号是 K9F2G08 基本结构: 不是很难自己看看,暂时不要看

  4. 扩展Wcf call security service, 手动添加 Soap Security Head.

    有次我们有个项目需要Call 一个 Java 的 web service, Soap包中需要一个 Security Head <soapenv:Header> <wsse:Secur ...

  5. Qt之QStringList讲解

    QStringList类提供了一个字符串列表 从QString继承而来,它提供快速索引为基础的接入以及快速插入和清除. 成员函数用于操作这个字符串列表如: append(),insert(),repl ...

  6. 【转】移动前端不得不了解的html5 head 头标签

    来源:http://blog.csdn.net/huang100qi/article/details/42596799 本文主要内容来自一丝的常用的 HTML 头部标签和百度FEX的HTML head ...

  7. .NET 泛型分析

    .NET 泛型解析 一.问题背景 我们在编程的时候往往因为需要处理不同类型的数据或者对象,重复编写很多类似的代码,造成代码的冗余,代码也显得不那么优雅,泛型的出现,正好是为了解决这个问题,实现继承. ...

  8. [转]LocalDB数据库修改排序规则,修复汉字变问号

    VS中新增的轻量级数据库LocalDB,有个这个,开发人员就不必再安装庞大的SQL server了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...

  9. 解决AndroidStudio中文乱码问题

    File→Settings Appearance.将Theme(皮肤)选为Windows.

  10. AutoHotkey 使用笔记

    注意事项 为了支持中文需安装 AutoHotkey_L Notepad2对ahk代码高亮和折叠支持良好,SciTE则能够提供输入提示 绿色版*.ahk关联AutoHotkey.exe就能双击运行 Au ...