从C#中的标准I/O读取非阻塞读取#
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参数吗? – CodesInChaos 2011-04-11 12:01:03
...是的。谢谢! – spender 2011-04-11 12:06:01
什么时候你的'EndRead'被触发?我认为只有当你到达流的末尾,或缓冲区已满时,而不是只有几个字符的输入可用。 – CodesInChaos 2011-04-11 12:11:16
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想要的。 – CodesInChaos 2011-04-11 11:35:13
哎。真?尽可能快地旋转一个循环,直到有钥匙可用?这很愚蠢。 – spender 2011-04-11 11:44:10
@spender这就是为什么在那里有'//做些更有用的评论'的原因。 – CodesInChaos 2011-04-11 11:48:26
为什么这不是一个真正的问题?我理解它是重复的,但是“不是真正的问题”对我来说很陌生。 – CodesInChaos 2011-04-11 11:33:38
@Mitch小麦:是不是ReadKey阻止? – jgauffin 2011-04-11 11:36:37
@Mitch你至少需要'KeyAvailable'和'ReadKey'。而且我还不确定这是否是正确的做法,以及它如何与重定向输入或死锁进行交互。所以这当然不是一个小问题。 – CodesInChaos 2011-04-11 11:37:24