【问题标题】:Prevent Program to close when the process exit C#当进程退出C#时防止程序关闭
【发布时间】:2018-11-29 10:26:37
【问题描述】:

我有一个批处理文件,我在整个过程中运行,但是当批处理文件完成运行并关闭时,表单也会关闭。我如何防止关闭表单的过程。这是代码。

Process support = new Process();
                        support.StartInfo.FileName = @"C:\Support\Support.bat";
                        support.EnableRaisingEvents = true;
                        support.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                        support.StartInfo.CreateNoWindow = true;
                        support.StartInfo.UseShellExecute = false;
                        support.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
                        support.StartInfo.RedirectStandardOutput = true;
                        support.Start();
                        support.BeginOutputReadLine();

这是将批处理文件的输出写入richTextbox的输出处理程序

private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
    {
        string line;
        line = (outLine.Data.ToString());
        txtStatus.AppendText(line + "\n");

    }

批处理文件完成后自动关闭,程序也关闭,不再执行其余代码。

【问题讨论】:

  • 您的问题中没有足够的信息。考虑提供minimal reproducible example
  • “表格”?我们没有任何信息,包括它与第一个代码块的关系。
  • 我应该发布整个代码吗?
  • 不,您应该点击链接到minimal reproducible example。创建一个需要技巧和努力,但无论如何,该技能是必不可少的调试技能。它是“我有一些奇怪的行为,证明这种行为的最小的代码是什么”。它可以帮助您丢弃不相关的内容,否则可能会分散您的注意力,因为您“确定”它们一定是问题的一部分。
  • 程序真的关闭了吗?您是否尝试在创建进程后放置断点?对我来说这似乎没问题,但如果你期望 bat 文件产生一些结果,你应该等到进程完成Process.WaitForExit()

标签: c# windows forms process


【解决方案1】:

你可以使用任何一个

Console.ReadLine();

Console.ReadKey();

ReadLine() 等待按下 Enter 键,而 ReadKey() 等待按下任意键(修饰键除外 - Shift、Control、Alt、Command、Option.. 等等)

如果这纯粹是为了从 VS 进行测试,那么您可以使用 Ctrl + F5 运行应用程序而无需调试

【讨论】:

  • 这是一个窗体应用程序
  • 好的,如果它正在执行批处理文件,取决于批处理文件中的内容,您能否在其末尾放置“暂停”以防止它在没有干预的情况下关闭?
  • 这听起来更像是出错和关闭而不是完成执行——在这种情况下,我会使用一些断点和调试来找出哪里出错了。批处理文件是否@“C:\Support\Support.bat”;存在于您尝试从中运行它的机器上吗?
  • 不幸的是我不是创建批处理文件的人,它执行很多命令并在执行后退出。试图把暂停放在最后不起作用。
  • 是的,批处理文件存在,我可以看到批处理文件执行的成功结果(它会生成它需要生成的正​​确文件)。问题是当批处理文件完成并退出时,表单也会退出。
【解决方案2】:

进程会自行打开一个窗口,一旦 .bat 文件退出,将退出并关闭主窗口。不是您的代码错误,而是默认情况下,如果您在资源管理器中双击 .bat 文件(cmd 会打开,直到 .bat 完成,然后再次关闭),则默认情况下会运行它

您提到您尝试过“Process.WaitForExit()”,但我想指出,在您的上下文中,它应该是“support.WaitForExit()”,就像您的“dt.WaitForExit()”(代码您发布的内容现已被删除)

如果这不起作用,请在 support.bat 文件的新行中添加“PAUSE”。这将防止窗口在按下键之前关闭。

如果您无权编辑 support.bat 文件,您只需读取文件内容并将其临时保存在某处,然后运行它...或添加它:

using (StreamWriter w = File.AppendText("support.bat"))
{
  w.WriteLine("PAUSE");
}

上面显然是一个示例,在再次写入文件之前,您需要检查“PAUSE”是否已经是最后一行。我也没有展示如何创建和保存文件的代码,你应该能够处理它:)

【讨论】:

  • 我都试过了。 Addidng support.WaitForExit() 并在批处理文件的末尾添加暂停,但输出是相同的。这是在那之前发生的事情。我使用相同的过程执行相同的批处理文件,但没有将结果写入richtextbox,一切正常。但是当我添加在richtextbox中写入结果的代码时,问题就发生了
  • 那么一定是发生了一些你正在压制或没有看到的错误
猜你喜欢
  • 2013-08-04
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2017-10-23
  • 2013-10-28
相关资源
最近更新 更多