1

我使用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 程序弹出我的应用程序正在运行,但该行之后的代码没有执行。当我按下暂停时,它指向这一行:

在此处输入图像描述

如果我使用:

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

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

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

侧面问题:

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

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

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

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

4

1 回答 1

0

对StandardOutput.ReadToEnd的调用将阻塞,直到此过程结束。这里的目标是读取、处理和响应您在接收到它们时生成的进程中的各种文本命令吗?
您必须通过异步读取来解决此问题。

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

于 2012-09-24T18:01:27.523 回答