【发布时间】:2017-12-12 20:04:28
【问题描述】:
我想通过以下方式从 C# 单声道进程的标准输入(标准输入)中读取一个字节(或字符):
- 如果已经有字节可用于从标准输入读取,则返回第一个
- 如果没有可用于从标准输入读取的字节,则继续进行而不等待任何内容或阻塞
- 如果有线程或异步,它应该是简洁且可证明正确的按需获取单个字节的直接解决方案
- stdin 可能是管道或文件,所以
Console.KeyAvailable不会这样做
谢谢。
【问题讨论】:
-
没有独立于平台的方式来执行异步 stdin I/O,这就是 BCL 不尝试的原因。 “标准输入流上的读取操作同步执行。也就是说,它们阻塞,直到指定的读取操作完成。”可以在 Mono 上实现吗?可能,如果您喜欢 P/Invoke 和
#if来处理各种平台。不过,与启动线程来包装同步操作相比,几乎可以肯定不值得这样做(并使用Console.IsInputRedirected来区分这种情况)。 -
@JeroenMostert 编写更多代码正是我想要避免的。我将举一个非常简洁的例子来说明如何以最短的方式完成它。这个想法是为了避免在问题上花费任何重要的代码或精力。来吧,2017年了!而且我们无法在没有线程或阻塞的情况下从流中读取字节!?
-
确实是 2017 年,但跨平台、非阻塞控制台 I/O 并不是一个需求量很大的功能——从来没有。时尚一直是控制台应用程序,它以同步、单线程的方式平静地处理其输入。如果您满足于轮询而不是真正的异步(就像您一样),那么在 Unix 和 Win32 上都相当容易做到(当然,同样的方式,这太容易了),但 .NET 更适合最小的公分母,这没有帮助。我无法在 10 分钟内想出一个简单的解决方案。不是说那里没有一个。
-
在思考的同时想出了一个不那么简单的解决方案。我希望有更好的答案,也许这会激励某人。
-
@JeroenMostert 轮询不是另一个线程的事件循环中的一个选项,在该循环中应该发生来自不同方向的事件的多路复用。
标签: c# mono stdin nonblocking