2011-04-11 11 views
15

Quiero una función de lectura sin bloqueo desde la consola.lectura sin bloqueo desde E/S estándar en C#

+5

Por qué no es una cuestión real? Entiendo cerrando como duplicado, pero como "no es una pregunta real" me parece extraño. – CodesInChaos

+0

@Mitch Wheat: ¿No está bloqueando ReadKey? – jgauffin

+0

@Mitch, necesita combinar al menos 'KeyAvailable' y' ReadKey'. Y todavía no estoy seguro de si eso es lo correcto, y cómo interactúa con la entrada redirigida o las claves muertas. Entonces ciertamente no es una pregunta trivial. – CodesInChaos

Respuesta

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

¿No olvidó el parámetro de conteo? – CodesInChaos

+0

... Sí. ¡Gracias! – spender

+0

¿Cuándo se activará su 'EndRead'? Creo que solo si llega al final de la transmisión, o cuando el búfer está lleno, y no si solo hay unos pocos caracteres de entrada disponibles. – CodesInChaos

38

Richard Dutton tiene una solución en 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 
} 
+0

el 'ConsoleKeyInfo' contiene el campo' KeyChar' que representa la representación 'char', que podría ser lo que quiere el OP. – CodesInChaos

+1

Ouch. De Verdad? ¿Simplemente gira un bucle lo más rápido posible hasta que haya una tecla disponible? Eso es estúpido. – spender

+12

@spender Es por eso que existe el comentario '// Hacer algo más útil' allí. – CodesInChaos