在.NET控制台应用程序中打开关闭应用

时间:2014-01-06 13:14:58

标签: c# console-application system.diagnostics

我正在从控制台应用程序打开外部应用程序,如下所示:

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运行此控制台应用程序。

有什么想法吗?提前谢谢你

3 个答案:

答案 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以在启动应用程序时出现问题时显示消息