我使用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()来不断检查读取输出的结束,而不是优雅。
考虑到方面问题,如果异步只是解决方案,我怎么能避免多线程问题?
我的线程知识很弱,所以在给出与线程相关的答案时请记住这一点。谢谢。
答案 0 :(得分:0)
对StandardOutput.ReadToEnd的调用将会阻止,直到此过程结束。这里的目标是从您生成的过程中读取,处理和响应各种文本命令吗? 你必须通过异步读取来解决这个问题。
例如,您可以设置一个Process.OutputDataReceived的监听器。然后拨打Process.BeginOutputReadLine开始阅读。您的代码将继续执行。同时,.NET Framework将在单独的线程上处理传入的文本消息。