Ich habe StreamReader
und möchte wissen, ob Daten verfügbar sind, ohne den Thread zu blockieren.
Ich habe die Peek
Methode versucht, aber sie blockiert, wenn keine Daten verfügbar sind.
Wenn ich den Mono-Code des Peeks überprüfe () Methode , heißt es in Kommentar
%Vor%Leider funktioniert der Link nicht mehr.
Ich habe hier gefunden, hier , hier und hier , dass Microsoft anscheinend einen Fehler hat, der Peek
zum Blockieren veranlasst. Aber all diese Beiträge sind ziemlich alt. Ich denke, mono hat absichtlich wegen dieses Fehlers Peek()
blockiert.
Ich habe also zwei Fragen
Peek()
blockiert? Wenn nein, sollte mono die Implementierung von Peek()
als nicht blockierend ändern. Okay, lassen Sie mich einfach sagen, dass ich nicht wirklich weiß, was Sie hier erreichen wollen. Wie ich jedoch sehen kann, muss die Methode Peek
den aktuellen Thread blockieren, damit er funktioniert. Das sagt die Dokumentation:
Die Peek-Methode gibt einen ganzzahligen Wert zurück, um festzustellen, ob Das Ende der Datei oder ein anderer Fehler ist aufgetreten. Dies ermöglicht einem Benutzer Überprüfen Sie zunächst, ob der zurückgegebene Wert -1 ist, bevor Sie ihn in ein Zeichen umwandeln Geben Sie ein.
Daher sollte Peek
nur -1 zurückgeben, wenn es auf einen Fehler oder ein Ende der Datei stößt. Dies ist ein wenig verwirrend, da möglicherweise keine Datei beteiligt ist. Der Stream könnte eine Antwort von WebRequest
sein. In diesem Fall wird der Teil des Streams, den Sie zu lesen versuchen, möglicherweise noch nicht heruntergeladen. Also, Peek
muss warten, bis es fertig ist, weil, und das ist nicht aus der Dokumentation klar, gibt es das erste Byte aus dem Stream gelesen.
Die Probleme, die in den von Ihnen geposteten Links erwähnt werden, betreffen mehrere Threads, die das gleiche StreamReader
verwenden, was nicht Ihr Fall ist. Ich glaube auch, dass es früher einen Fehler gab, der dazu führte, dass ein StreamReader
auf die Eingabe wartete, um einen anderen zu blockieren, aber ich glaube, dass es seither behoben wurde. Ich bin mir nicht sicher, was die Mono-Implementierung tut.
Um Ihre Frage zu beantworten, ohne den Thread zu blockieren, würde ich Folgendes versuchen:
ReadAsync
und dann await
oder ContinueWith
für die Aufgabe, damit sie nicht blockiert. Wie jedoch in den Kommentaren richtig angemerkt wurde, brauchen Sie wirklich Peek
, wenn Sie das Ganze in einen anderen Thread einfügen? Warum nicht einfach in den typischen Block while (Read(...)) { ... }
einfügen und die Daten verarbeiten, während sie kommen?