【发布时间】:2010-11-06 20:14:43
【问题描述】:
我正在用 C# 编写一个替代的 Windows shell,我目前正在实现的功能是将所有 IO 都放在同一个 shell 窗口中 - 即,不在另一个窗口中打开 cmd.exe。
现在,我有一个输出的部分解决方案。这是我的代码(其中 p 是正在运行的进程):
while ( !p.HasExited ) {
/* ... - irrelevant */
if ( redirect ) {
try {
p.BeginOutputReadLine();
} catch { }
}
}
进程设置了所有正确的属性,例如UseShellExecute = False、RedirectStandard{Input, Output, Error} = True,并且事件处理程序设置正确,但不一致。
我已经尝试取出 try/catch(我知道这是非常糟糕的做法),并使用忙布尔,当处理程序运行时设置为 false,但由于某种原因,我仍然在 p 上收到 InvalidOperationException .BeginOutputReadLine() - 说明已经有一个异步操作在运行。
任何帮助都将不胜感激,即使它需要与上述解决方案完全不同的解决方案,而不仅仅是修复它。
谢谢。
编辑:这是启动该过程的代码:
if (redirect)
{
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.OutputDataReceived += new DataReceivedEventHandler(redirectHandler_StdOut);
p.ErrorDataReceived += new DataReceivedEventHandler(redirectHandler_StdErr);
}
p.Start();
另外,我意识到我并没有解释我所说的不一致是什么意思。正如他们所说,一张照片值得2^3的话:
【问题讨论】:
-
启动进程的代码是什么样的?
-
我现在就更新问题:)