【问题标题】:Started process hangs when redirected output is relatively big [duplicate]当重定向的输出相对较大时,启动的进程挂起[重复]
【发布时间】:2012-09-18 15:31:33
【问题描述】:

我今天遇到了这个问题,我花了很长时间才弄清楚。我从 IIS 中启动一个进程,重定向它的标准输出和错误输出,所以当进程退出时,我可以用它生成一个日志。在我的机器上一切都运行良好,但在我发布后就不那么好了。

该过程应该运行一段时间然后退出,但它不会。它只是停止响应,持有像套接字这样的资源。过了好一阵子,我才确定了问题的原因:生成的日志太大了。从正在运行的进程中评论Console.WriteLine 后,一切正常。

只是为了澄清我是如何开始这个过程的:

Process process = new Process();
process.StartInfo.FileName = path;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.EnableRaisingEvents = true;
process.Exited += Process_Exited;
process.Start();

以及我如何处理它的退出:

private static void Process_Exited(object sender, EventArgs e)
{
    Process process = (Process)sender;
    File.WriteAllText(path, process.StandardOutput.ReadToEnd() +
    "\r\nEXCEPTIONS\r\n" + process.StandardError.ReadToEnd());
}

即使我已经知道如何修复它,我仍然想知道到底发生了什么以及为什么,因为我必须有一种方法来创建一个我想要的日志。

【问题讨论】:

    标签: c# asp.net iis process redirectstandardoutput


    【解决方案1】:

    documentation for RedirectStandardOutput 描述的不是一种,而是两种可能的死锁场景(对于一个有用且不危险的类库来说,这如何?!)

    当 StandardOutput 和 StandardError 都被重定向并且正在读取的流已满时会发生这种情况。这似乎完美地描述了您的情况。

    这是一种非常烦人的情况,但请阅读完整的文档,其中描述了如何避免这种情况发生。

    【讨论】:

    • 我相信确实是这样!答案在文档中,真让我感到羞耻。感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多