不理解的多线程,当p.Kill();的时候线程都禁止了,应用程序都退出了,那下面的语句应该不会执行了?我想要的效果是结速当前运行的进程,同时将网上下载的覆盖当前运行的.exe文件,实现一种自动更新的功能,如果不用p.Kill();话,是可以执行的,但是又出现问题了,会提示该文件正在被另一个进程占用,不能覆盖和访问此文件,(但是目的就是为了停止当前线程,从网上下载更新版的线程,下载完毕后,启动下载最新的版本)
Process [] allProcess = Process.GetProcesses();
foreach(Process p in allProcess)
{
if (p.ProcessName.ToLower() + ".exe" == mainAppExe.ToLower() )
{
for(int i=0;i<p.Threads.Count;i++)
p.Threads[i].Dispose();
p.Kill();
isRun = true;
//break;
}
}
WebClient wcClient = new WebClient();
for(int i = 0;i < this.lvUpdateList.Items.Count;i++)
{
string UpdateFile = lvUpdateList.Items[i].Text.Trim();
string updateFileUrl = updateUrl + lvUpdateList.Items[i].Text.Trim();
long fileLength = 0;
WebRequest webReq = WebRequest.Create(updateFileUrl);
WebResponse webRes = webReq.GetResponse();
fileLength = webRes.ContentLength;
lbState.Text = "正在下载更新文件,请稍后...";
pbDownFile.Value = 0;
pbDownFile.Maximum = (int)fileLength;
try
{
Stream srm = webRes.GetResponseStream();
StreamReader srmReader = new StreamReader(srm);
byte[] bufferbyte = new byte[fileLength];
int allByte = (int)bufferbyte.Length;
int startByte = 0;
while(fileLength > 0)
{
Application.DoEvents();
int downByte = srm.Read(bufferbyte,startByte,allByte);
if (downByte == 0) {break;};
startByte += downByte;
allByte -= downByte;
pbDownFile.Value += downByte;
float part = (float)startByte / 1024;
float total = (float)bufferbyte.Length / 1024;
int percent =Convert.ToInt32((part/total)*100);
this.lvUpdateList.Items[i].SubItems[2].Text = percent.ToString() + "%";
}
string tempPath = tempUpdatePath + UpdateFile;
CreateDirtory(tempPath);
FileStream fs = new FileStream(tempPath,FileMode.OpenOrCreate,FileAccess.Write);
fs.Write(bufferbyte,0,bufferbyte.Length);
srm.Close();
srmReader.Close();
fs.Close();
}
catch(WebException ex)
{
MessageBox.Show("更新文件下载失败!"+ex.Message.ToString(),"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
只要当前进程没有彻底退出,文件就会一直被锁定,不管你后面的代码的事,要执行你工作需要做更多的事情。
解决:
哈哈说的有点啰嗦,你整理下,思路和流程图就出来了。