Im 인간 대 컴퓨터 게임에 전원을 공급하기 위해 Stockfish 게임 엔진을 사용하고 있습니다. 모든 것이 괜찮다는이 시점에서Reading StandardInput은 응용 프로그램을 중단하지 않고 코드 실행을 중지합니다.
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();
}
같은 일 만 문 동안에서 발생합니다. 결과에는 거기에 전체 가치가있다, 모든 텍스트가 그것에 기록됩니다.
비동기 읽기없이이를 극복 할 수있는 방법이 있습니까?
사이드 문제 :이 이후
은 내가 (잠금 포함) 보호 할 수있는 방법 임 확실하지 때문에 비동기 읽기를 사용하여 같은 느낌 해달라고, 전체 ASP.NET 응용 프로그램을 통해 사용되는 싱글 톤 클래스의 모든 부분에 여러 그것에 쓰는 쓰레드. 또한, 명령 처리가 10 초까지 지속될 수 있기 때문에 현재 스레드를 중지하는 방법을 모른다.
나는 Thread.Sleep()을 사용하여 끊임없이 출력의 끝을 확인하고 우아하지는 않은지 생각하지 않습니다.
사이드 문제를 고려할 때 비동기가 유일한 해결책 인 경우 어떻게 멀티 스레드 문제를 피할 수 있습니까?
내 스레딩 지식이 약하기 때문에 스레드 관련 답변을 제공 할 때 명심하십시오. 고맙습니다.
문제는 내가 ReadLine()을 사용할 때 선이있는 한 작동한다는 것입니다. 엔진이 반환 한 텍스트가 더 이상 없을 때 사용하면 그림과 같이 끊어집니다. 최악의 경우는 얼마나 많은 줄이 있는지 모르고 길이를 얻거나 데이터의 끝을 감지 할 길이 없습니다. 비동기 aproach를 사용했는데 제대로 동작하지만 프로그램이 "dead lock"을 입력하지 않지만 다음과 같은 다른 문제가 발생합니다. 프로그램이 계속되지만 엔진이 모든 데이터를 반환하지 않습니다. –