Nicht blockierende Möglichkeit zu prüfen, ob ein StreamReader Daten verfügbar hat

8

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.

%Vor%

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

  1. Stimmt es, dass Microsoft einen Fehler hat, der Peek() blockiert? Wenn nein, sollte mono die Implementierung von Peek() als nicht blockierend ändern.
  2. Gibt es eine andere Möglichkeit zu überprüfen, ob ein StreamReader Daten verfügbar hat, ohne den Thread zu blockieren?
Alexandre Pepin 21.10.2014, 19:36
quelle

2 Antworten

0

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:

  1. Einfach das Ganze in einen separaten Thread einfügen. Dann ist es dir egal, ob es blockiert ist oder nicht.
  2. Verwenden Sie 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?

    
vesan 21.10.2014, 22:45
quelle
0
  1. Ich kann keine Antworten geben, ich habe keinen konkreten Fall, den ich reproduzieren und testen könnte, und offensichtlich ist die Quelle nicht verfügbar.
  2. Mit .NET 4.5 können Sie die ReadAsync-Methode aus der StreamReader-Klasse verwenden
Louis 21.10.2014 19:44
quelle

Tags und Links