2017-04-19 2 views
-1

Ich habe eine seltsame Frage in meinem Code, ich versuche, eine Datei aus dem Antwort-Stream eines Servers zu transformieren.Ich kann den Code nach einem Weile Block nicht erreichen

Aber wenn ich die Stream.CopyTo() oder die Methode unten verwenden und es debuggen, erreicht es nie die fs.Flush().

enter image description here

kann ich die while-Block erreichen und es gibt nicht eine Endlosschleife. Wenn bs.Read zum Ende kommt, endet die Schleife auch, aber den Code danach nicht erreichen.

+9

Bitte poste deinen Code als Text, nicht als Bild. – wkl

+5

Ich denke, Ihre currentDataLength ist immer größer 0 –

+0

statt für die Verwendung von Schleife –

Antwort

1

Während ist eine Schleife, die nicht endet, bis die Bedingung false entspricht. Nehmen wir an, der Wert für currentDataLength ändert sich mit jedem CPU-Zyklus, ist aber immer größer als 0 (oder geht nie unter 0), es wird weitergehen.

Sehen, dass Sie den Wert currentDataLength einmal außerhalb der while Schleife ändern, und dann wieder drin. Die Chancen stehen gut, dass es weitergeht bis bs.Read() RETURNS etwas Negatives.

Eine gute Idee wäre, den Zustand der While-Schleife zu ändern. Aber das hängt vollständig von der Verwendung Ihres Codes ab.

+1

Also, Ihre Antwort mehr verschmiert und zerkaut, guter Punkt! –

1

Ich glaube nicht, dass Sie sogar fs.Flush() anrufen müssen, weil Sie in einem using Block sind - der IDisposable implementiert und sollte automatisch darauf achten, den Stream in die Datei zu schreiben, wenn das Objekt entsorgt wird.

ich denke, es könnte etwas mit der Tatsache zu tun, dass Sie eine große Puffergröße als Standard für BufferedStream verwenden, die 4096 Bytes ist (Sie BufferedStream mit dem Standardwert initialisieren). So Read wird immer in dem Fall enden, wenn es weniger Bytes als angefordert gelesen hat. In diesem Fall kann es passieren, dass Deadlocks auftreten, wenn Sie von einem Port/Pipe lesen. Sehen Sie sich an, was gerade passiert the source code for Read here.

+0

Dies ist ein Kommentar zum Code, der keine Antwort auf die gestellte Frage darstellt. Ich bin mir ziemlich sicher, dass 'Flush' aufgerufen werden muss ... – TheLethalCoder

+0

Denke nicht. http://stackoverflow.com/questions/2417978/what-is-the-difference-zwischen-streamwriter-flush-and-streamwriter-close – Achilles

+0

Ich hatte Fälle, in denen ich 'Flush' explizit nennen musste, egal wie Sie beantworten die Frage nicht wie gefragt. Das OP will wissen, warum 'Flush' nicht aufgerufen wird, nicht ob es gerufen wird oder nicht. – TheLethalCoder

0

Die while-Schleife kehrt nie zurück, weil der Parameter stream auf die neue Antwort von meinem Server wartet. So kann die Read(...) Methode nie zu Ende gehen, weil es auf die Antwort wartet, die geschlossen wird.

Also wenn es zum Ende (Strom) des Stromes kommt, wird der Hauptfaden für neue Antwort aussetzen und scheint wie eine Endlosschleife.

ich meinen Code des Servers geändert und dann wird das Problem gelöst:

public static void SendFile(HttpListenerResponse oResp, string filePath, long startPoint) 
{ 
    using (FileStream fs = File.OpenRead(filePath)) 
    { 
     fs.Seek(startPoint, SeekOrigin.Begin); 
     fs.CopyTo(oResp.OutputStream); 
     //Added: close the response 
     oResp.Close(); 
    } 
} 

Ansonsten habe ich die fs.Flush von Code in Frage Beschreibung gefunden noch nicht erreichen, ich denke, es in using Block nicht effektiv kann .

Verwandte Themen