2011-04-11 56 views
15

我想从控制台读取一个非阻塞读取功能。从C#中的标准I/O读取非阻塞读取#

+5

为什么这不是一个真正的问题?我理解它是重复的,但是“不是真正的问题”对我来说很陌生。 – CodesInChaos 2011-04-11 11:33:38

+0

@Mitch小麦:是不是ReadKey阻止? – jgauffin 2011-04-11 11:36:37

+0

@Mitch你至少需要'KeyAvailable'和'ReadKey'。而且我还不确定这是否是正确的做法,以及它如何与重定向输入或死锁进行交互。所以这当然不是一个小问题。 – CodesInChaos 2011-04-11 11:37:24

回答

5
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); 
+0

你不忘记count参数吗? – CodesInChaos 2011-04-11 12:01:03

+0

...是的。谢谢! – spender 2011-04-11 12:06:01

+0

什么时候你的'EndRead'被触发?我认为只有当你到达流的末尾,或缓冲区已满时,而不是只有几个字符的输入可用。 – CodesInChaos 2011-04-11 12:11:16

38

Richard Duttonhis 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 
} 
+0

'ConsoleKeyInfo'包含'KeyChar'字段,它代表'char'表示,这可能是OP想要的。 – CodesInChaos 2011-04-11 11:35:13

+1

哎。真?尽可能快地旋转一个循环,直到有钥匙可用?这很愚蠢。 – spender 2011-04-11 11:44:10

+12

@spender这就是为什么在那里有'//做些更有用的评论'的原因。 – CodesInChaos 2011-04-11 11:48:26