Gewusst wie: zurückgeben eines Streams aus einer Methode, zu wissen, sollte es entsorgt werden?
Habe ich eine Methode, die FileStream-als input. Diese Methode wird innerhalb einer for-Schleife.
private void UploadFile(FileStream fileStream)
{
var stream = GetFileStream();
//do things with stream
}
Habe ich eine andere Methode, die erstellt und gibt den FileStream:
private FileStream GetFileStream()
{
using(FileStream fileStream = File.Open(myFile, FileMode.Open))
{
//Do something
return fileStream;
}
}
Nun die erste Methode wirft eine ObjectDisposedException
wenn ich versuche, Zugriff auf die zurückgegebenen FileStream, wahrscheinlich, weil Sie bereits geschlossen, da bin ich mit "using
" ordnungsgemäß zu entsorgen stream.
Wenn ich nicht verwenden, "mit", und verwenden Sie stattdessen wie folgt, dann die FileStream geöffnet bleibt und für die nächste iteration der Schleife (Betriebssystem auf der gleichen Datei) wirft eine Ausnahme, sagen die Datei ist schon in Verwendung:
private FileStream GetFileStream()
{
FileStream fileStream = File.Open(myFile, FileMode.Open);
//Do something
return fileStream;
}
Wenn ich einen try-finally-block, wo ich den stream schließen, in der finally
es dann auch wirft die ObjectDisposedException
.
Wie effektiv die Rückkehr stream-Datei und schließen Sie es?
- Sie kann es nicht schließen, auch nicht deine Aufgabe. Verwenden Sie einen guten Namen. "Get" ist nicht genug, um zu helfen dem Programmierer herauszufinden, dass er braucht, um über den stream, verwenden Sie "Create" statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zurückkehren, wenn Sie eine
IDisposable
von einer Methode, Sie verwies die Verantwortung für die Entsorgung es um Ihre Anrufer. So müssen Sie erklären, Ihreusing
- block, um die gesamte Nutzung des Stroms, die in Ihrem Fall vermutlich erstreckt sich über dieUploadFile
nennen.Das problem ist, dass das FileStream-Objekt wird entsorgt, sobald Sie beenden aus dem
GetFileStream()
Methode, so dass es in einem unbrauchbaren Zustand. Wie die anderen Antworten schon zeigen, müssen Sie entfernen denusing
block aus, dass Methode und stattdessen dieusing
- block, um den code, der diese Methode aufruft:Allerdings möchte ich noch einen Schritt weiter. Sie wollen eine Möglichkeit zum Schutz der stream erstellt, indem Ihr
GetFileStream()
von dem Fall, wo ein schlampiger Programmierer könnte die Methode aufrufen, ohne eineusing
block, oder zumindest irgendwie stark zeigen, um Anrufer, dass das Ergebnis dieser Methode muss eingeschlossen werden, mit einerusing
block. Daher empfehle ich dieses:Beachten Sie, dass Sie nicht unbedingt brauchen zu erstellen eine ganz neue Klasse für diese. Möglicherweise haben Sie bereits eine entsprechende Klasse für diese Methode, wo man nur hinzufügen der IDisposable-code. Die Hauptsache ist, dass Sie verwenden können
IDisposable
als signal für andere Programmierer, dass dieser code gewrappt werden mit einemusing
block.Zusätzlich setzt dich auf die Klasse ändern, so dass man erstellen Sie Ihre IDisposable-Objekt einmal vor der Schleife, und die neue Instanz der Klasse verfolgen alles, was Sie brauchen, zu entsorgen am Ende der Schleife.
IDisposable
ist als ein signal an die anderen Programmierer? Wie gehen andere Programmierer wissen bei der Instanziierung dieser Klasse, sollten Sie wickeln Sie Ihren code in eineusing
block?Wenn Sie eine Methode brauchen, um wieder eine Datei öffnen stream dann alle Aufrufer dieser Methode müssen die Verantwortung für die Entsorgung der zurückgegebenen stream, da es entsorgen darf den stream, bevor er es wieder.