我使用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() 不断检查读取输出的结束,这不优雅。
考虑到侧面问题,如果异步只是解决方案,我怎么能避免多线程问题?
我的线程知识很薄弱,所以在给出线程相关的答案时请记住这一点。谢谢你。