Angenommen, ich habe eine Klasse, die die Methoden BeginLongOperation()
und EndLongOperation()
mit dem Standard-Anfangs- / Endmuster verfügbar macht und IDisposable
implementiert.
Liegt es in meiner Klasse, einen Aufruf von Dispose()
zwischen den Aufrufen von BeginLongOperation()
und EndLongOperation()
zu bearbeiten?
Wenn ja, was ist der richtige Weg, dies zu tun?
Ich gehe davon aus, dass Begin / End-Methoden asynchron sind. Oder dass Ihre Objekte von einem anderen Thread bearbeitet werden können.
Zuerst müssen Sie feststellen, ob Sie die Instanzen Ihrer Klasse wirklich entsorgen müssen. Wenn dies der Fall ist, müssen Sie Ihre Dispose () -Methode entwerfen (Ihre Klasse sollte IDisposable Schnittstelle), so dass die lange Ausführung nicht gestört wird. Nun, es hängt davon ab, welche Richtlinie Sie implementieren möchten: Möchten Sie warten, bis ein langer Vorgang abgeschlossen ist, oder sollte ein Aufruf der Dispose () - Methode den langen Vorgang unterbrechen?
Normalerweise rufen Sie die Dispose () -Methode niemals aus dem Code Ihrer Klasse heraus auf, aber Sie müssen den Dispose () -Aufruf vor einer unangemessenen Verwendung schützen.
Daher glaube ich, dass es Ihre Verantwortung ist, Ihren Code gegen mögliche Szenarien zu schützen, selbst gegen einen (unerwünschten) Anruf zwischen Anfang und Ende.
SPÄTER EDIT: Natürlich, wie andere Leute hier Ihnen gesagt haben, ist die Verantwortung des Benutzers Ihrer Klasse es richtig zu benutzen, ABER ich würde mich NICHT darauf verlassen. Wie Sie wissen, wird das Objekt, wenn die letzte Referenz auf Ihr Objekt nicht mehr vorhanden ist, einer Müllsammlung unterzogen. Dieses schlechte Verwendungsmuster könnte tatsächlich einen Aufruf von Dispose () zwischen Start / Ende selbst in einem Nicht-Async / Single-Thread-Design bestimmen.
Liegt es an meiner Klasse, einen Anruf an Dispose () zwischen zu erledigen? die Aufrufe von BeginLongOperation () und EndLongOperation ()?
Nein, es liegt in der Verantwortung des Anrufers Ihrer Klasse, es ordnungsgemäß zu entsorgen. Dies könnte in der EndLongOperation
-Methode erfolgen. Sie können die Instanz nicht in eine using
-Anweisung einschließen, da die BeginLongOperation
-Methode sofort zurückgegeben wird.
Beispiel mit einem WebClient
:
Idee hinter dem IDisposable ist unten und ich denke, das beantwortet auch deine Frage.
Die primäre Verwendung dieser Schnittstelle besteht darin, nicht verwaltete Ressourcen freizugeben. Der Garbage Collector gibt automatisch den Speicher frei, der einem verwalteten Objekt zugewiesen wurde, wenn dieses Objekt nicht mehr verwendet wird. Es ist jedoch nicht möglich, vorherzusagen, wann die Garbage Collection stattfinden wird. Darüber hinaus verfügt der Garbage Collector über keine nicht verwalteten Ressourcen wie Fensterhandles oder geöffnete Dateien und Streams.
Verwenden Sie die Dispose-Methode dieser Schnittstelle, um nicht verwaltete Ressourcen in Verbindung mit dem Garbage Collector explizit freizugeben. Der Konsument eines Objekts kann diese Methode aufrufen, wenn das Objekt nicht mehr benötigt wird.
Es ist also Aufgabe des Entwicklers, der Ihre Klasse verwendet, um Dispose () zu rufen.