首页 新闻 会员 周边

不理解的多线程

0
悬赏园豆:15 [已关闭问题] 关闭于 2010-07-19 11:18

  不理解的多线程,当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);
    }
   }

平凡网客的主页 平凡网客 | 初学一级 | 园豆:9
提问于:2010-07-12 10:27
< >
分享
所有回答(1)
0

只要当前进程没有彻底退出,文件就会一直被锁定,不管你后面的代码的事,要执行你工作需要做更多的事情。

  • 首先更新程序应该和主程序分类,这样更新程序可以独立运行,主程序就不会有文件锁定的烦恼。
  • 有可能涉及对更新程序的更新,这个时候比较麻烦,所以需要更多的工作。

解决:

  1. 上面的原则不变,需要分离主程序和更新程序。
  2. 主程序启动的时候,可以调用更新程序在后台执行,可以用Process类来实现,当更新程序下载完成后提示用户退出主程序,进行升级替换。
  3. 如果更新程序在检测到自身的升级,可以先下载保存在指定的位置,等待下载主程序启动时候,先执行更新程序升级,然后再执行步骤2。

哈哈说的有点啰嗦,你整理下,思路和流程图就出来了。

TinyTian | 园豆:385 (菜鸟二级) | 2010-07-12 13:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册