Chcę, aby funkcja odczytu nie blokowała się z konsoli.Niezablokowanie odczytu ze standardowego wejścia/wyjścia w języku C#
Odpowiedz
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);
Nie zapomniałeś parametru licznika? – CodesInChaos
... Tak. Dzięki! – spender
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
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
}
'ConsoleKeyInfo' zawiera pole' KeyChar', które reprezentuje reprezentację 'char', która może być tym, co chce OP. – CodesInChaos
Ouch. Naprawdę? Po prostu obróć pętlę tak szybko, jak to możliwe, aż klucz będzie dostępny? To głupie. – spender
@spender Dlatego istnieje tam komentarz "// Zrób coś bardziej użytecznego". – CodesInChaos
- 1. Jak przycinać linie odczytu ze standardowego wejścia na bash?
- 2. Filtrowanie wartości ze standardowego języka C#
- 3. Odczytanie liczby całkowitej ze standardowego wejścia
- 4. coraz wejściowe ze standardowego wejścia
- 5. Nie można wywołać zdarzenie „end” CTRL D podczas odczytu ze standardowego wejścia
- 6. C: Odczytaj ze standardowego wejścia, aż do dwukrotnego naciśnięcia Enter.
- 7. Interakcja ze stronami internetowymi w języku C#
- 8. Czy obiekt może sam się wymazać ze standardowego kontenera C++?
- 9. Pole tekstowe tylko do odczytu w języku C#
- 10. Jak czytać ze standardowego wejścia z fgetami()?
- 11. Jak odczytać pojedynczy ciąg ze standardowego wejścia?
- 12. Biorąc wejściowe ze standardowego wejścia po freopen()
- 13. Przekierowywanie standardowego wyjścia c, a następnie resetowanie standardowego wyjścia
- 14. Grafika używa tylko standardowego C++?
- 15. Przechwytywanie zawartości standardowego wyjścia w C#
- 16. Jak wykonać niezablokowanie fopen na nazwanej potoku (mkfifo)?
- 17. Korzystanie ze wskaźników znalezionych w Cheat Engine w języku C#
- 18. Czy tylko do odczytu w Objective-C?
- 19. Czy mogę czytać ze standardowego wejścia w sposób niekanoniczny?
- 20. przesyłanie wielu plików ze skryptu powłoki za pomocą standardowego wejścia
- 21. Jak uzyskać nazwę funkcji ze wskaźnika funkcji w języku C#?
- 22. Jaki jest pożytek ze słowa kluczowego `default` w języku C#?
- 23. Łańcuch porównywania ze znakami specjalnymi w języku C#
- 24. Uzyskaj listę certyfikatów ze sklepu certyfikatów w języku C#
- 25. Wywołanie znaku * w C DLL obsługiwane jako ciąg w języku C#. Problem ze znakami NUL
- 26. Czytaj znak ze standardowego wejścia w Go (bez naciskania przycisku Enter)
- 27. Struktury odczytu i zapisu w C
- 28. Prędkość/wydajność Charakterystyka blokowania vs niezablokowanie winsock
- 29. Jak wywołać określoną metodę ze skryptu w języku Python w języku C#?
- 30. W języku XML, jakie są węzły ze znakami zapytania, i jak dodać je w języku C#?
Dlaczego to nie jest prawdziwe pytanie? Rozumiem zamknięcie go jako duplikatu, ale jako "nie jest to prawdziwe pytanie" wydaje mi się dziwne. – CodesInChaos
@Mitch Wheat: Czy nie blokuje ReadKey? – jgauffin
@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