C# 从C中的标准I/O进行非阻塞读取#

C# 从C中的标准I/O进行非阻塞读取#,c#,console-application,nonblocking,C#,Console Application,Nonblocking,我想要一个控制台的非阻塞读取功能。如何在C#中书写?有一个解决方案: 为什么这不是一个真正的问题?我可以理解为重复关闭它,但“不是一个真正的问题”对我来说看起来很奇怪。@Mitch Wheat:ReadKey不是阻塞吗?@Ondrej引用OP:“从控制台”人们会说这太模糊而关闭它,这有点令人恼火。我是通过搜索“c#non-blocking console input”来到这里的,这正是我所要寻找的。有用的问题,有用的讨论和答案。别吹毛求疵了,有些人实际上是利用这个网站来完成事情的。谢谢为什么这不

我想要一个控制台的非阻塞读取功能。如何在C#中书写?

有一个解决方案:


为什么这不是一个真正的问题?我可以理解为重复关闭它,但“不是一个真正的问题”对我来说看起来很奇怪。@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);