2011-04-11 15 views
15

Chcę, aby funkcja odczytu nie blokowała się z konsoli.Niezablokowanie odczytu ze standardowego wejścia/wyjścia w języku C#

+5

Dlaczego to nie jest prawdziwe pytanie? Rozumiem zamknięcie go jako duplikatu, ale jako "nie jest to prawdziwe pytanie" wydaje mi się dziwne. – CodesInChaos

+0

@Mitch Wheat: Czy nie blokuje ReadKey? – jgauffin

+0

@Mitch musisz połączyć co najmniej 'KeyAvailable' i' ReadKey'. I nadal nie jestem pewien, czy to jest właściwe postępowanie i jak wchodzi w interakcje z przekierowanymi wejściami lub martwymi kluczami. Z pewnością nie jest to trywialne pytanie. – CodesInChaos

Odpowiedz

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

Nie zapomniałeś parametru licznika? – CodesInChaos

+0

... Tak. Dzięki! – spender

+0

Kiedy uruchomi się 'EndRead'? Myślę, że tylko jeśli dotrzesz na koniec strumienia lub gdy bufor jest pełny, i nie, jeśli dostępnych jest tylko kilka znaków wejściowych. – CodesInChaos

38

Richard Dutton ma rozwiązanie na 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

'ConsoleKeyInfo' zawiera pole' KeyChar', które reprezentuje reprezentację 'char', która może być tym, co chce OP. – CodesInChaos

+1

Ouch. Naprawdę? Po prostu obróć pętlę tak szybko, jak to możliwe, aż klucz będzie dostępny? To głupie. – spender

+12

@spender Dlatego istnieje tam komentarz "// Zrób coś bardziej użytecznego". – CodesInChaos

Powiązane problemy