日期:2014-05-17  浏览次数:20876 次

开启一个新的进程来杀掉本来的进程
在做WinForm程序的在线更新一类的功能的时候,经常会遇到这种问题,就是我在开启一个新的进程Update.exe的时候,之后必须要退出当前QQ.exe  而此时如果当前进程Application.Exit(),可能会由于替换主程序文件时主程序仍未退出而导致更新失败

经常解决的办法是,开启一个新的进程来杀掉应用程序进程,代码如下

private static void KillSelf()  //如果只是启用进程运行Update.exe后,当前进程Application.Exit(),可能会由于替换主程序文件时主程序仍未退出而导致更新失败
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.WriteLine("taskkill /PID " + Process.GetCurrentProcess().Id.ToString());
            p.StandardInput.WriteLine("exit");

            while (!p.HasExited)//因为这是异步执行的,我在当前的进程中去操作另外的进程,这个属性指的是这个另外的进程是否顺利的完成了其任务
            {
                p.WaitForExit(1000); //这个进程在退出之前等待1秒,如果此时完成了就退出,如果没有完成,就不退出
            }
        }


我在想,为什么这么复杂,直接在QQ.exe进程的代码中,Process.GetCurrentProcess然后直接Kill掉不行吗?
还有,上边的代码中,在Kill方法中,我既然通过p杀掉了主进程,在while之前这个操作就完成了,那么while后边的代码是不是早就不执行了?

------解决方案--------------------
自己杀掉自己?
你应该让update.exe啥掉主程序进程,或者更友好点,在update.exe检查有没有主进程运行,有的话提示用户如果更新必须退出主程序之类的提示语。
你看现在主流程序在线更新不都是这样的吗?哪有自己杀自己的