我正在从控制台应用程序打开外部应用程序,如下所示:
var p = new Process
{
StartInfo =
{
FileName = "SomeApp.exe"
}
};
p.Start();
Thread.Sleep(10000);
p.CloseMainWindow(); //Bam!! InvalidOperationExcetion
如何关闭SomeApp.exe?我正在围绕这个应用程序构建一些自动化程序,我希望每当我完成它时它都会关闭,但到目前为止我还没有成功。
p.CloseMainWindow()
抛出InvalidOperationException类型的异常,并显示消息“无法处理请求,因为进程(1216)已退出。”
我没有杀死这个过程,我不知道是什么杀了它。 我在管理员模式下从Visual Studio运行此控制台应用程序。
有什么想法吗?提前谢谢你
答案 0 :(得分:3)
当您致电.WaitForExit()
时,您当前的流程将等待外部应用程序关闭。之后调用.Kill()
毫无意义,因为该过程已经消失。一个简单的例子:
var p = new Process
{
StartInfo =
{
FileName = "cmd.exe"
}
};
p.Start();
Console.WriteLine("press any key to kill the other app");
Console.ReadKey();
if (!p.HasExited)
{
p.Kill();
Console.WriteLine("other app was killed");
}
else
{
Console.WriteLine("other app was already dead");
}
Console.ReadKey();
根据您的需要,您也可以跳过当前代码中对.Kill()
的调用 - 正如我所提到的,外部流程已在.WaitForExit()
之后消失。
答案 1 :(得分:1)
对WaitForExit()
的调用会阻止调用线程,直到进程退出。所以事后没有什么可以杀的!
您可以在使用Kill()
属性调用HasExited
之前检查线程的状态,并调用ClsoeMainWindow()
关闭应用程序。如果这不起作用,Kill
过程:
var p = new Process
{
StartInfo =
{
FileName = "SomeApp.exe"
}
};
p.Start();
// Do whatever...
if (!p.HasExited)
{
if (!p.CloseMainWindow())
p.Kill();
}
答案 2 :(得分:1)
这将要求应用程序关闭 - 这将允许它询问用户是否要保存任何打开的文档等。
var p = new Process
{
StartInfo =
{
FileName = "SomeApp.exe",
ErrorDialog = true
}
};
p.Start();
Thread.Sleep(5000);//or do whatever you need with the application
p.CloseMainWindow();
p.WaitForExit();
这将结束这个过程。您仍需WaitForExit()
因为Process.Kill()
异步运行
var p = new Process
{
StartInfo =
{
FileName = "SomeApp.exe",
ErrorDialog = true
}
};
p.Start();
Thread.Sleep(5000);//or do whatever you need with the application
p.Kill();
p.WaitForExit();
更新:添加ErrorDialog = true
以在启动应用程序时出现问题时显示消息