我制作的程序抛弃了通过进程启动可执行文件的线程。每个线程运行下面的方法,该方法启动进程并将进程的输出重定向到字符串(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();
}
}
答案 0 :(得分:2)
不确定这是否可能导致问题,但根据此处的代码,您ThreadProc
在Process
对象完成之前退出。根据{{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
个对象,直到进程终止