winform异步系统升级—BackgroundWorker
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的更多相关文章
- winform异步进度条LongTime
winform异步进度条LongTime,运用到回调函数 定义事件的参数类: namespace LongTime.Business { // 定义事件的参数类 public class ValueE ...
- WinForm中使用BackgroundWorker异步加载数据并使用进度条
在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...
- C# 使用BackgroundWorker实现WinForm异步
写了一个基于BackgorundWorker演示异步操作的例子.由于这个理基本上实现了BackgorundWorker的大部分功能:异步操作的启动.操作结束后的回调.异步操作的撤销和进度报告等等.尽管 ...
- 实现 winform 异步跨线程访问UI控件
在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...
- 一个简单的webservice的demo(下)winform异步调用webservice
绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...
- 1 Winform 异步更新控件
刚才看到有人问为了winfrom中,在大数据绑定的时候出现画面假死的状态,为了解决这个问题希望通过再开一个线程来给控件绑定数据,可是画面还是会假死.现在看到的方法有1.掩耳盗铃法(Control.Ch ...
- 基于事件的异步模式——BackgroundWorker
实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...
- Winform中设置BackgroundWorker在取消时关闭后台进程
场景 在Winform中拖拽 一个BackgroundWorker控件,配合进度条控件能开启一个后台线程并报告进度条进度. 但是在执行后台线程的任务时,如果想要取消,怎样让其停止执行. 注: 博客主页 ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
随机推荐
- cmd光标移动
ESC:清除当前命令行.F1: 单字符输出上次输入的命令 相当于方向键上的 → 的作用.F2: 可复制字符数量 , 输入上次命令中含有的字符,系统自动删除此字符后的内容.F3: 重新输入前一次输入的命 ...
- py2exe使用方法
一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...
- 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法
一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...
- nodejs与模块soap的用法
最近做了点东西要求用到soap模块,我是怎么知道的呢,收到了 <soap:Body><soap:Fault><faultcode>soap:Client</f ...
- 关于linux下关于ssd的使用
1. 这几个文件系统可以在挂载的时候使用 discard 选项:ext4, xfs, jfs, vfat 2. 使用 fstrim 命令可以实现周期性的 trim,挂载时使用discard标记可以实 ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量
<zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- HTML5&CSS3练习笔记(二)
HTML5&CSS3 练习CSS3伪选择器使用 1.first-line 格式:元素:first-line 说明:设置同一个标签下所有行内容的第一行的样式,例如: <table st ...
- delphi实现的RTMP播放
其实知道原理用什么语言实现都是可以的 1. 服务器 提供http服务, 点击start运行. 2. 测试客户端 定时获取http服务的数据, 坐标是服务器中写死的, 在中国地图中画了一个圈. 如: { ...
- 【笔记】js Function类型 内部方法callee
运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...
- 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 ...