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. cmd光标移动

    ESC:清除当前命令行.F1: 单字符输出上次输入的命令 相当于方向键上的 → 的作用.F2: 可复制字符数量 , 输入上次命令中含有的字符,系统自动删除此字符后的内容.F3: 重新输入前一次输入的命 ...

  2. py2exe使用方法

    一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...

  3. 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法

    一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...

  4. nodejs与模块soap的用法

    最近做了点东西要求用到soap模块,我是怎么知道的呢,收到了 <soap:Body><soap:Fault><faultcode>soap:Client</f ...

  5. 关于linux下关于ssd的使用

    1. 这几个文件系统可以在挂载的时候使用 discard  选项:ext4, xfs, jfs, vfat 2. 使用 fstrim 命令可以实现周期性的 trim,挂载时使用discard标记可以实 ...

  6. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

  7. HTML5&CSS3练习笔记(二)

    HTML5&CSS3  练习CSS3伪选择器使用 1.first-line  格式:元素:first-line 说明:设置同一个标签下所有行内容的第一行的样式,例如: <table st ...

  8. delphi实现的RTMP播放

    其实知道原理用什么语言实现都是可以的 1. 服务器 提供http服务, 点击start运行. 2. 测试客户端 定时获取http服务的数据, 坐标是服务器中写死的, 在中国地图中画了一个圈. 如: { ...

  9. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...

  10. Infinite loop when using cookieless session ID on Azure

    If you use cookieless session ID and deploy them on Azure, you might get infinite loop when you quer ...