【问题标题】:c# stdin read not respondingc# stdin 读取无响应
【发布时间】:2012-08-28 03:40:35
【问题描述】:

我有一个监听控制台标准输入流的程序。

  • Read() 返回时,每个字符被一个一个读出并传递给method()
  • method() 然后将字符附加到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();
    }
}

编辑:
刚刚测试了一下,发现跟线程没有关系,就把那部分拿走了。我最初发布它是因为它是我的其他程序中的一个问题,这只是一个测试模型来演示它。

【问题讨论】:

  • 是否有意让您的 Main 方法结束?
  • 请在您的文本中添加标点符号、大写字母和空格,以便我破译。
  • @HenkHolterman 确实违背了多线程的观点。
  • 抱歉,刚刚进一步测试,正在编辑我的问题。
  • 尝试在您的响应方法中显示一个消息框。也可能关闭您的输出流可能会有所帮助。

标签: c# stream console-application stdout stdin


【解决方案1】:

我会这样改变程序:

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();
}

它更容易且有效。主要区别是使用StreamReaderStreamWriter 代替Stream

【讨论】:

  • 我怎么会忘记那些课呢?谢谢!不过,我的程序没有问题。
  • 因为 readline() 以 "\r\n"、"\n" 或 "\r" 结尾,虽然它对我的程序影响不大,但我决定试试 streamreader 的 read (),它完美地工作。所以我确定问题出在 MS 对流的 read() 的错误实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多