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 ...
随机推荐
- LinQ 简单使用
LinQ: 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where以 ...
- win7 64位 asp+access 数据库连接出错[代码:02],请检查数据库链接文件中的连接字串
解决办法,启用32位应用程序改为true 打开“Internet 信息服务(IIS)管理器”,在最右边的窗口中点击“应用程序池”,在用到的应用程序池上点击右键,选择“高级设置”
- php 设计模式
一.工厂模式 1.创建接口类,规范方法,要实现这个接口的类必须实现这个接口的所有方法,接口的方法默认是抽象的,所以不再方法前面加 abstract interface people{ public f ...
- jQuery File Upload done函数没有返回
最近在使用jQuery File Upload 上传图片时发现一个问题,发现done函数没有callback,经过一番折腾,找到问题原因,是由于dataType: ‘json’造成的,改为autoUp ...
- web分享QQ好友、QQ空间、新浪微博的api接口
QZone: "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITL ...
- Java高效编程之四【C语言结构的替代】
本章节可以跳过,但是[二十一]是非常有价值的 十九.用类代替结构 坚持以包含私有域和公有访问方法(accessor method)的类.Java平台中有几个类违反了“公有类不应该直接暴露数据域”的告诫 ...
- 【转载】调试利器 autoexp.dat
转载:http://www.cppblog.com/flyinghare/archive/2010/09/27/127836.html autoexp.dat入门(调试时自定义变量显示) VC在调试状 ...
- C#的HTTP协议中POST与GET的区别
引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来.但是如果我问你HTTP协议的请求方法有哪些?POST与GET的差异?GET或POST传送数据量的大小有限制吗?HTTP响应的状态 ...
- fetch 关于七牛的content-type 的问题
七牛要的Content-Type: multipart/form-data; boundary=<frontier>:那个boundary(formdata分隔符)是浏览器自己加的,不用管 ...
- Linq解析带命名空间、前缀、Soap格式的XML
关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...