【发布时间】:2011-05-27 12:07:36
【问题描述】:
我正在使用 Process 类调用控制台应用程序。我将输出重定向到日志文件,但是当我不重定向输出时,控制台窗口中的消息比我重定向时日志文件中的消息多。任何想法为什么?
ProcessStartInfo psi = new ProcessStartInfo();
string filename = @"ProgrammingMaster_LocalPowertrain.exe";
psi.FileName = filename;
string arguments = String.Format("{0} {1} false", InstanceId.ToString(), ManifestFolderPath);
psi.Arguments = arguments;
LogMessage(msgType.Warning, filename + " - " + arguments);
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
FBlockProcess = new Process();
FBlockProcess.StartInfo = psi;
FBlockProcess.OutputDataReceived += new DataReceivedEventHandler(FBlockProcess_OutputDataReceived);
FBlockProcess.ErrorDataReceived += new DataReceivedEventHandler(FBlockProcess_ErrorDataReceived);
FBlockProcess.Start();
FBlockProcess.BeginOutputReadLine();
FBlockProcess.BeginErrorReadLine();
在我的 OutputDataReceived 处理程序中,我只是将字符串添加到 ConcurrentQueue
编辑: 我应该补充一点,我想实时或接近捕获输出。该过程可能需要 30 多分钟才能运行,我不想等那么久才能看到发生了什么。
更新: 在输出前四行之后,永远不会调用 OutputDataReceived eventHandler,即使我知道当我不重定向时还有 10 或 15 行输出到控制台。关于可能导致这种情况的任何想法?
【问题讨论】:
-
可能与流的冲洗有关?
-
你在关闭流之前调用 WaitForExit() 吗?
-
@codymanix - 没有。我认为使用事件会变得没有必要。
-
进程对象可能会被垃圾回收,在这种情况下你不会再得到偶数了,试着把它的引用存储在一个静态变量中,看看是否能解决它,而不是 that 是一个解决方案,但很容易测试看看 GC 是否是这里的罪魁祸首。
-
@Lasse - 即使我可以看到该进程仍在任务管理器中运行,是否有必要这样做?