2011-04-11 12 views
15

Desidero una funzione di lettura non bloccante dalla console.Lettura non bloccante da I/O standard in C#

+5

Perché questa non è una vera e propria domanda? Capirei di chiuderlo come duplicato, ma come "non una vera domanda" mi sembra strano. – CodesInChaos

+0

@Mitch Wheat: il blocco di ReadKey non è corretto? – jgauffin

+0

@Me è necessario combinare almeno 'KeyAvailable' e' ReadKey'. E non sono ancora sicuro se questa è la cosa giusta da fare e come interagisce con input reindirizzati o chiavi morte. Quindi non è certamente una domanda banale. – CodesInChaos

risposta

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

Non hai dimenticato il parametro count? – CodesInChaos

+0

... Sì. Grazie! – spender

+0

Quando verrà attivato il tuo 'EndRead'? Penso solo se arrivi alla fine dello stream, o quando il buffer è pieno, e non se sono disponibili solo pochi caratteri di input. – CodesInChaos

38

Richard Dutton ha una soluzione sul 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

il 'ConsoleKeyInfo' contiene il campo' KeyChar' che rappresenta la rappresentazione 'char', che potrebbe essere ciò che l'OP vuole. – CodesInChaos

+1

Ouch. Veramente? Basta girare un loop il più velocemente possibile fino a quando un tasto è disponibile? Questo è stupido. – spender

+12

@spender Ecco perché c'è il commento // Fai qualcosa di più utile lì dentro. – CodesInChaos