res*_*sgh 2 c# stdin stdout stream console-application
我有一个程序,侦听控制台stdin流.
Read()返回时,每个字符被读出一个接一个,并传递给method(). method()然后将角色附加到a StringBuilder.'\n',则method()调用respond(),打印出读取的字符并清除StringBuilder.但是,即使在控制台中键入内容并按Enter键后,我也必须按下/移动鼠标,鼠标按键或控制台焦点内的键盘才能回显键入的文本.更神秘的是,当我在第一个大括号中设置断点Main()并进入之后的每个语句时,程序正确执行.我怎样才能解决这个问题?非常感谢!
public class test
{
static byte[] buffer = new byte[1];
static Stream instrm = Console.OpenStandardInput();
static Stream outstrm = Console.OpenStandardOutput();
static System.Text.StringBuilder sb = new System.Text.StringBuilder();
static void Main()
{
while (true)
{
instrm.Read(buffer, 0, 1);
method(buffer);
}
}
public static void method(byte[] buffer)
{
sb.Append(System.Text.Encoding.UTF8.GetString(buffer));
if (buffer[0] == (byte)10) respond();
}
public static void respond()
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
outstrm.Write(bytes, 0, bytes.Length);
outstrm.Flush();
sb.Clear();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我刚测试,发现它与线程无关,所以把部分拿走了.我最初发布它,因为它是我的其他程序中的一个问题,这只是一个测试模型来演示它.
我会改变这样的程序:
static byte[] buffer = new byte[1];
static TextReader instrm = new StreamReader(Console.OpenStandardInput());
static TextWriter outstrm = new StreamWriter(Console.OpenStandardOutput());
static StringBuilder sb = new StringBuilder();
static void Main()
{
while (true)
{
var readLine = instrm.ReadLine();
respond(readLine);
}
}
public static void respond(string line)
{
outstrm.Write(line);
outstrm.Flush();
}
Run Code Online (Sandbox Code Playgroud)
它更容易和有效.主要区别在于使用StreamReader而StreamWriter不是Stream.