从 stdin 非阻塞读取一个字节

Non-blocking read of a byte from stdin

我想通过以下方式从 C# mono 进程的标准输入(标准输入)读取一个字节(或字符):

谢谢。

如果您的平台有 System.Collections.Concurrent.BlockingCollection 的实现,这里有一个简单但不完全有效的方法:

class ConsoleReader {
  private readonly BlockingCollection<int> buffer = new BlockingCollection<int>(1);
  private readonly Thread readThread;
  public ConsoleReader() {
    readThread = new Thread(() => {
      if (Console.IsInputRedirected) {
        int i;
        do {
          i = Console.Read();
          buffer.Add(i);
        } while (i != -1);
      } else {
        while (true) { 
          var consoleKeyInfo = Console.ReadKey(true);
          if (consoleKeyInfo.KeyChar == 0) continue;  // ignore dead keys
          buffer.Add(consoleKeyInfo.KeyChar);
        }
      }
    });
  }

  public void Start() {
    readThread.Start();
  }

  public int? Next {
    get {
      int result;
      return buffer.TryTake(out result, 0) ? result : default(int?);
    }
  }
}

免责声明:此答案实际上并未在 Mono 上进行过测试,只是在完整的 .NET 平台上进行了短暂测试。 您可以使用 Task 而不是 Thread、适当的取消等来增加它的趣味性,但这不会改变显式等待同步操作(Console.ReadConsole.ReadKey 两者都是)。 .NET 本身不提供便携式异步控制台 I/O。自己跨平台实施(使用 OS 功能)是可能的,但绝对不平凡。