从 C# 中的标准 I/O 进行非阻塞读取 [关闭]
Posted
技术标签:
【中文标题】从 C# 中的标准 I/O 进行非阻塞读取 [关闭]【英文标题】:Non-Blocking read from standard I/O in C# [closed] 【发布时间】:2011-08-02 23:58:03 【问题描述】:我想要一个来自控制台的非阻塞读取功能。我如何用 C# 编写它?
【问题讨论】:
为什么这不是一个真正的问题?我会理解将其关闭为重复,但“不是一个真正的问题”对我来说看起来很奇怪。 @Mitch Wheat:ReadKey 不会阻塞吗? @Ondrej 引用 OP:“来自控制台” 人们会声称这太模棱两可并将其关闭,这有点令人讨厌。我通过搜索“c# 非阻塞控制台输入”来到这里,这正是我想要的。有用的问题,有用的讨论和答案。别吹毛求疵了,有些人实际上使用这个网站来完成工作。谢谢! 为什么这不是一个真正的话题。我有确切的问题。如何在 c# 的循环中对字符进行非阻塞读取。 【参考方案1】:Richard Dutton在his blog上有解决方案:
while (true)
if (Console.KeyAvailable)
ConsoleKeyInfo key = Console.ReadKey(true);
switch (key.Key)
case ConsoleKey.F1:
Console.WriteLine("You pressed F1!");
break;
default:
break;
// Do something more useful
【讨论】:
ConsoleKeyInfo
包含字段 KeyChar
,它代表 char
表示,这可能是 OP 想要的。
@spender 这就是为什么会有// Do something more useful
评论。
这个答案非常适合我想要的。我有一个程序运行无限循环并输出内容,但我希望能够通过键盘字符输入命令而不会阻塞循环。
我认为这是 OP 正在寻找的真正答案,并且可能应该被标记为正确的答案。无论如何,它做了我正在寻找的东西。谢谢。
当它不是控制台时,它实际上不会从标准输入读取!【参考方案2】:
var buf=new byte[2048];
var inputStream=Console.OpenStandardInput(); //dispose me when you're done
inputStream.BeginRead(buf,0,buf.Length,ar=>
int amtRead=inputStream.EndRead(ar);
//buf has what you need. You'll need to decode it though
,null);
【讨论】:
你没有忘记count参数吗? 你的EndRead
什么时候会被触发?我认为只有当您到达流的末尾或缓冲区已满时,而不是只有几个输入字符可用时才到达。
啊。你是对的。实际上,流似乎只在回车时被刷新。你的方法看起来越来越好!
如果没有可阅读的内容,似乎不起作用(挂起)。阻止。以上是关于从 C# 中的标准 I/O 进行非阻塞读取 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章