C# 从C中的标准I/O进行非阻塞读取#
我想要一个控制台的非阻塞读取功能。如何在C#中书写?有一个解决方案:C# 从C中的标准I/O进行非阻塞读取#,c#,console-application,nonblocking,C#,Console Application,Nonblocking,我想要一个控制台的非阻塞读取功能。如何在C#中书写?有一个解决方案: 为什么这不是一个真正的问题?我可以理解为重复关闭它,但“不是一个真正的问题”对我来说看起来很奇怪。@Mitch Wheat:ReadKey不是阻塞吗?@Ondrej引用OP:“从控制台”人们会说这太模糊而关闭它,这有点令人恼火。我是通过搜索“c#non-blocking console input”来到这里的,这正是我所要寻找的。有用的问题,有用的讨论和答案。别吹毛求疵了,有些人实际上是利用这个网站来完成事情的。谢谢为什么这不
为什么这不是一个真正的问题?我可以理解为重复关闭它,但“不是一个真正的问题”对我来说看起来很奇怪。@Mitch Wheat:ReadKey不是阻塞吗?@Ondrej引用OP:“从控制台”人们会说这太模糊而关闭它,这有点令人恼火。我是通过搜索“c#non-blocking console input”来到这里的,这正是我所要寻找的。有用的问题,有用的讨论和答案。别吹毛求疵了,有些人实际上是利用这个网站来完成事情的。谢谢为什么这不是一个真正的话题。我问的正是这个问题。如何在c#中对循环中的字符进行非阻塞读取。
ConsoleKeyInfo
包含字段KeyChar
,该字段表示char
表示,这可能是OP想要的。@spender这就是为什么这里有//做一些更有用的注释的原因。这个答案非常适合我想要的。我有一个运行无限循环并输出内容的程序,但我希望能够在不阻塞循环的情况下通过键盘字符输入命令。我认为这是OP搜索的真正答案,可能是应该标记为正确的答案。无论如何,它做了我一直在寻找的事情。谢谢。当它不是控制台时,它实际上并没有从stdin读取!您忘了计数参数了吗?什么时候触发EndRead
?我认为只有当你到达流的末尾,或者缓冲区满了的时候,而不是只有几个字符的输入是可用的。你说得有点对。事实上,这条小溪似乎只有在马车返回时才被冲走。你的方法看起来越来越好了!如果没有什么可读的,它似乎不起作用(挂起)。舞台调度。
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
}
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);