Fire-and-Forget-Aufgaben mit der Task Parallel Library: Entsorgungsbedenken
Beim Auslösen von Fire-and-Forget-Aufgaben mit der Task Parallel Bibliothek (TPL) stehen Entwickler häufig vor Fragen zur ordnungsgemäßen Entsorgung von Task-Objekten. Während in der MSDN-Dokumentation die Notwendigkeit betont wird, Dispose() vor der Veröffentlichung der letzten Referenz aufzurufen, sind die praktischen Auswirkungen, wenn man dies nicht tut, unklar.
Laut Stephen Toub von Microsoft dient die Task-Entsorgung in erster Linie dazu, potenziell nicht verwaltete Ressourcen zu verwalten Wird verwendet, wenn auf den Abschluss einer Aufgabe gewartet wird. In Szenarien, in denen nur Fortsetzungen verwendet werden (wie bei Fire-and-Forget-Aufgaben), wird dieses Ereignishandle jedoch nicht zugewiesen.
In einem aktuellen Blogbeitrag stellt Toub weiter klar, dass in .Net 4.5 das interne Das Wartehandle wird nur zugewiesen, wenn die Eigenschaft IAsyncResult.AsyncWaitHandle explizit abgerufen wird. Darüber hinaus verfügt das Task-Objekt selbst nicht über einen Finalizer. Stattdessen wird das Handle mit einem Finalizer in ein Objekt gekapselt. Sofern das Handle nicht zugewiesen ist, wird kein Finalizer aufgerufen.
Zusammenfassung
Basierend auf diesen Erkenntnissen:
In den meisten Fällen ist es akzeptabel, Dispose() nicht aufzurufen. Der Finalizer übernimmt die Bereinigung.
Ja, Stephen Toubs Blogbeitrag enthält detaillierte Erklärungen.
Der Aufruf von Dispose() ist in den meisten Szenarien nicht notwendig.
Nein, das Muster der Verwendung von Task.Factory.StartNew() ist der empfohlene Ansatz für Feuer-und-Vergessen-Aufgaben.
Das obige ist der detaillierte Inhalt vonSollte ich Fire-and-Forget-Aufgaben im TPL entsorgen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!