c#标准数据读取未响应
我有一个程序监听控制台stdin流c#标准数据读取未响应,c#,stream,console-application,stdout,stdin,C#,Stream,Console Application,Stdout,Stdin,我有一个程序监听控制台stdin流 当Read()返回时,将逐个读取每个字符并将其传递给method() method()然后将字符附加到StringBuilder 如果字符是'\n',则method()调用respond(),这将打印出读取的字符并清除StringBuilder 但是,即使在控制台中键入内容并按Enter键后,我也必须在控制台焦点内按/移动鼠标、鼠标按钮或键盘,才能回显键入的文本。更神秘的是,当我在Main()的第一个大括号中设置一个断点并在此后的每一条语句中单步执行时,程
- 当
返回时,将逐个读取每个字符并将其传递给Read()
李>method()
然后将字符附加到method()
李>StringBuilder
- 如果字符是
,则'\n'
调用method()
,这将打印出读取的字符并清除respond()
StringBuilder
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();
}
}
编辑:我只是测试了一下,发现它和线没有任何关系,所以把零件拿走了。我最初发布它是因为它在我的另一个程序中是一个问题,这只是一个演示它的测试模型。我会这样更改程序:
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();
}
它更简单,也更有效。主要区别是使用
StreamReader
和StreamWriter
来代替Stream
是否有意让您的主要方法结束?请在文本中添加字符、大写字母和空格,以便我可以破译。@HenkHolterman不想突破多线程的观点。抱歉,只是进一步测试了它,正在编辑我的问题。请尝试在答复方法中显示消息框。另外,关闭输出流可能会有所帮助。我怎么会忘记这些类呢?谢谢尽管如此,我还是没有发现我的程序有什么问题。由于readline()以“\r\n”、“\n”或“\r”结尾,尽管它对我的程序影响不大,但我决定试用streamreader的read(),它工作得非常好。因此,我确信问题在于MS对stream的read()的糟糕实现。