C#,进程输出有时不会被捕获(不一致)?

时间:2011-07-28 12:54:14

标签: c# multithreading redirect output-redirect

我制作的程序抛弃了通过进程启动可执行文件的线程。每个线程运行下面的方法,该方法启动进程并将进程的输出重定向到字符串(info.additional,即每个进程)。
我通过大量的试验和错误了解到我必须以某种方式重定向输出(使用事件来接收输出)或者流死锁。

现在,我正在运行双核机器,如果我有两个线程运行并启动进程,程序运行良好并完美捕获这些进程的输出。但是当我移动到两个以上的线程(比我有核心的线程多)时,输出有时不会被捕获。为什么是这样?有谁知道如何解决这个问题?
谢谢你,乔

    public void ThreadProc()
    {
        info.watch.Start();
        proc = InstantiateProcess();
        proc.Start();
        proc.BeginOutputReadLine();
    }


    private void procOutputDataReceived(object sendingProcess, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            //Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
            this.info.additional += e.Data.ToString();
        }
    }

2 个答案:

答案 0 :(得分:2)

不确定这是否可能导致问题,但根据此处的代码,您ThreadProcProcess对象完成之前退出。根据{{​​3}}文档,您应该调用WaitForExit()“正在处理异步输出的应用程序应调用WaitForExit()方法以确保已刷新输出缓冲区。”基于该行,我认为如果你不这样做,你可能会丢失一些数据。

在一个不相关的说明中,Process对象实现了IDisposable,所以我建议像这样更改你的ThreadProc方法(注意我在这里没有看到proc的声明,但是正如你所说的那样我启动多个进程我假设proc不是一个成员变量,声明只是在样本中省略了:

public void ThreadProc()
{
    info.watch.Start();
    using (var proc = InstantiateProcess())
    {
        proc.Start();
        proc.BeginOutputReadLine();
        proc.WaitForExit();
    }
}

答案 1 :(得分:0)

除非你确保保留Process对象的引用,否则它们将被垃圾收集,在这种情况下,它们上的事件将停止触发。

简单的解决方案:

  • 存储Process个对象,直到进程终止