Wird ein MemoryStream automatisch entsorgt, wenn er als ActionResult zurückgegeben wird?

7
%Vor%

Ich bin es gewohnt, die Anweisung 'using' in Verbindung mit MemoryStreams zu verwenden. Ist dies ein Szenario, in dem die 'using' Aussage nicht notwendig ist? Oder ist es zulässig, die Rückgabe innerhalb einer using-Anweisung aufzurufen?

BEARBEITEN:

Für meine Zwecke habe ich festgestellt, dass die Einführung einer 'using'-Anweisung NICHT funktioniert (löst eine ObjectDisposedException aus). Hier ist, was ich mit ihm clientseitig mache:

%Vor%     
Sean Anderson 10.01.2012, 17:50
quelle

4 Antworten

20
  

Wird ein MemoryStream automatisch entsorgt, wenn er als ActionResult zurückgegeben wird?

Ja, MVC (mindestens Version 3) wird es für Sie aufräumen. Sie können eine Quelle der Methode WriteFile verwenden in FileStreamResult :

%Vor%

Die Zeile using (FileStream) { platziert den Stream in einen using-Block und disponiert ihn daher, wenn er den Inhalt in die HTTP-Antwort geschrieben hat.

Sie können dieses Verhalten auch überprüfen, indem Sie einen Dummy-Stream erstellen, der dies tut:

%Vor%

Also MVC wird es entsorgen.

    
vcsjones 10.01.2012, 18:13
quelle
2

Sean: Benutze NICHT 'using', da es das Objekt entsorgen wird. Verlassen von MVC Zugriff auf ein Disposed-Objekt. Daher ist die Ausnahme (Serverfehler), die Sie erlebt haben, sicherlich eine ObjectDisposedException. Die WriteFile-Funktion, die zuvor gepostet wurde, stellt das Objekt für Sie bereit.

    
Steven Licht 11.01.2012 04:50
quelle
2

Ein MemoryStream ist in dieser Situation nicht notwendig. Sie können dies vermeiden, indem Sie ein Custom ActionResult wie folgt erstellen:

%Vor%     
Kalten 29.08.2013 09:10
quelle
-4

Der folgende Code ist gültig und entsorgt den Stream. Wenn sie in einem using -Block eingeschlossen ist, wird die MemoryStream.Dispose() -Methode automatisch beim Zurückgeben aufgerufen.

%Vor%

Sie können dasselbe Ergebnis erzielen, indem Sie das Objekt in einen try -Block setzen und dann Dispose in einem finally-Block aufrufen. Gemäß der MSDN-Dokumentation wird die using-Anweisung vom Compiler übersetzt. Und in einem try..finally -Block wird der finally immer ausgeführt, auch wenn try durch return endet.

Der Compiler übersetzt den using -Block in folgendes:

%Vor%     
Dennis Traub 10.01.2012 18:00
quelle