async / await und die IDisposable-Schnittstelle

7

Ich habe eine Klasse, die die IDisposable-Schnittstelle implementiert, um eine private Variable anzuordnen _MailMessage Die selbe Klasse hat eine asynchrone Methode, die die private IDisposable-Variable verwendet, nämlich async public Task<bool> Send Meine Frage lautet: Wird die normale IDisposable-Implementierung verfügen die private Variable nach der Async-Methode abgeschlossen? Hier ist ein Beispiel für die Klasse, von der ich spreche:

%Vor%

Ich habe die IDisposable-Implementierung gemäß einer der Antworten geändert, die vorschlagen, keinen Destruktor zu verwenden:

%Vor%     
Kees de Wit 17.09.2013, 12:26
quelle

2 Antworten

10

Sie tun es ziemlich grundlegend falsch. Eine gute Regel, wenn man bedenkt, dass man, wenn man denkt , dass man einen Destruktor braucht, in 99,9% der Fälle falsch liegt. Ein Destruktor ist nur erforderlich, wenn Sie eine private Variable eines nicht verwalteten Typs haben, die freigegeben werden muss. Du nicht. Die Art, wie du es sagen kannst, ist falsch, wenn du herausfindest, dass du gar nichts machst, wenn das disposing Argument falsch ist. Oder mit anderen Worten, der Destruktor tut eigentlich gar nichts. So ist es nicht nötig. Dann brauchen Sie auch kein Einwegmuster.

Es gibt mehr Fehler, Sie müssen die IDisposable-Schnittstelle erben, um Ihre eigene Dispose () -Methode zu implementieren. Du hast es vergessen.

Ihre Dispose () -Methode muss vom Client-Code aufgerufen werden, der eine Instanz Ihrer Email-Klasse erstellt. Sie können es nicht selbst aufrufen, Sie wissen nicht, wann der Client-Code Ihr E-Mail-Objekt nicht mehr verwendet. Das ist eine schnelle Antwort auf Ihre Frage. Sie können sich nicht mit der Methode Send () abfinden. Es gibt keine Garantie, dass der Client-Code es tatsächlich aufruft. Sie müssen es dem Client-Code überlassen, um es richtig zu machen.

    
Hans Passant 17.09.2013, 13:41
quelle
14

Ich sehe nirgendwo, dass Sie explizit _MailMessage anders als in Email.Dispose ablegen.

async macht mit IDispose nichts besonders Magisches; Das einzige, was Sie beachten müssen, ist, dass async -Methoden möglicherweise früh zurückkehren.

Wenn du es also so nennst:

%Vor%

Dann wird Ihr Aufrufcode (asynchron) darauf warten, dass Send abgeschlossen ist, bevor Sie email entsorgen. Aber wenn du es so nennst:

%Vor%

Dann wird in Ihrem Anrufcode email vor Send abgeschlossen.

    
Stephen Cleary 17.09.2013 12:45
quelle

Tags und Links