我制作了一个需要在3个进程之间进行大量通信的软件。但是,在某些时候,Process.StandardInput中的WriteLine(string)方法只会挂起程序。
这是codesnippet,它被称为多次
public void Talk(string message)
{
if (!started)
Start();
LogConsole.Log("-> " + this.Name + ": " + message, LogMode.GameLog);
this.process.StandardInput.WriteLine(message.ToCharArray(), 0, message.Length);
}
答案 0 :(得分:2)
当您重定向流程的标准I / O时,您必须确保实际上始终正在读取输入。播放中的缓冲区有限,因此如果其中一个进程停止读取其输入,则从另一个进程写入将阻塞,直到缓冲区被清空/读取为止。
正确处理此问题的最简单方法是始终使用异步I / O来处理读写标准输入/输出/错误。除非这种情况发生异步,否则很容易导致两个进程之间出现死锁(例如,一个进程尝试写入而另一个进程也尝试写入,并且它们没有达到实际的程度读取数据,这样它们在写入时都会卡住,因为缓冲区已满。
另外,不要Flush
。这不是一个好主意。