经常解决的办法是,开启一个新的进程来杀掉应用程序进程,代码如下
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后边的代码是不是早就不执行了?
3 个解决方案
#1
自己杀掉自己?
你应该让update.exe啥掉主程序进程,或者更友好点,在update.exe检查有没有主进程运行,有的话提示用户如果更新必须退出主程序之类的提示语。
你看现在主流程序在线更新不都是这样的吗?哪有自己杀自己的
你应该让update.exe啥掉主程序进程,或者更友好点,在update.exe检查有没有主进程运行,有的话提示用户如果更新必须退出主程序之类的提示语。
你看现在主流程序在线更新不都是这样的吗?哪有自己杀自己的
#2
如果是同一个进程中
Process.Start(Application.ExecutablePath);
Environment.Exit(0);
Process.Start(Application.ExecutablePath);
Environment.Exit(0);
#3
自己杀自己干嘛?直接退出不就行了?
在更新进程里杀掉吧。
在更新进程里杀掉吧。
#1
自己杀掉自己?
你应该让update.exe啥掉主程序进程,或者更友好点,在update.exe检查有没有主进程运行,有的话提示用户如果更新必须退出主程序之类的提示语。
你看现在主流程序在线更新不都是这样的吗?哪有自己杀自己的
你应该让update.exe啥掉主程序进程,或者更友好点,在update.exe检查有没有主进程运行,有的话提示用户如果更新必须退出主程序之类的提示语。
你看现在主流程序在线更新不都是这样的吗?哪有自己杀自己的
#2
如果是同一个进程中
Process.Start(Application.ExecutablePath);
Environment.Exit(0);
Process.Start(Application.ExecutablePath);
Environment.Exit(0);
#3
自己杀自己干嘛?直接退出不就行了?
在更新进程里杀掉吧。
在更新进程里杀掉吧。