读取StandardInput可以在不中断应用程序的情

时间:2012-09-24 17:28:32

标签: c# multithreading

我使用Stockfish游戏引擎为Human Vs Computer游戏提供动力。 这是代码的第一部分:

Process _proc= new Process();
_proc.StartInfo = new ProcessStartInfo(path);
_proc.StartInfo.RedirectStandardInput = true;
_proc.StartInfo.RedirectStandardOutput = true;
_proc.StartInfo.UseShellExecute = false;
_proc.StartInfo.CreateNoWindow = true;
_proc.Start();
_proc.StandardInput.WriteLine("uci");
_proc.StandardInput.WriteLine("ucinewgame");

此时一切正常,但是当我尝试阅读StandardOutput时,会发生一些奇怪的事情。

string result = _proc.StandardOutput.ReadToEnd();

Stockfish.exe程序弹出我的应用程序正在运行但该行之后的代码没有执行。当我按下暂停时,它指向这一行:

  

enter image description here

如果我使用:

while (!_proc.StandardOutput.EndOfStream)
{
    result += _proc.StandardOutput.ReadLine();
}

同样的事情只发生在while语句中。结果在那里有全部值,所有文本都写入其中。

有没有办法在没有异步阅读的情况下克服这个问题?

问题:

由于这是在整个ASP.NET应用程序中使用的单例类的所有部分,我不喜欢使用异步读取,因为我不知道如何保护(通过锁定)多个线程写入它。另外,我不知道如何停止当前线程,因为命令处理可以持续长达10秒。

我不想使用Thread.Sleep()来不断检查读取输出的结束,而不是优雅。

考虑到方面问题,如果异步只是解决方案,我怎么能避免多线程问题?

我的线程知识很弱,所以在给出与线程相关的答案时请记住这一点。谢谢。

1 个答案:

答案 0 :(得分:0)

StandardOutput.ReadToEnd的调用将会阻止,直到此过程结束。这里的目标是从您生成的过程中读取,处理和响应各种文本命令吗? 你必须通过异步读取来解决这个问题。

例如,您可以设置一个Process.OutputDataReceived的监听器。然后拨打Process.BeginOutputReadLine开始阅读。您的代码将继续执行。同时,.NET Framework将在单独的线程上处理传入的文本消息。