Ist die Aufgabenentsorgung für Fire-and-Forget-Hintergrundaufgaben erforderlich?
Beim Ausführen von Fire-and-Forget-Aufgaben in Hintergrundthreads, Entwickler verwenden häufig die Task Parallel Library (TPL)-Methode Task.Factory.StartNew(). Diese Methode gibt ein Task-Objekt zurück, was Bedenken hinsichtlich der ordnungsgemäßen Entsorgung aufwirft.
MSDN-Dokumentation empfiehlt, Dispose() aufzurufen, bevor der letzte Verweis auf eine Task freigegeben wird. Das Warten auf den Abschluss der Aufgabe zum Aufrufen dieser Methode macht jedoch den Zweck der Hintergrundausführung zunichte.
Diskussion
Laut Stephen Toub vom Microsoft pfx-Team kann ein Task-Objekt dies tun Umschließen Sie ein Ereignishandle, wenn Sie auf dessen Abschluss warten. Wenn jedoch Fortsetzungen verwendet werden, wird dieses Handle nie zugewiesen. Daher ist die Finalisierung eine geeignete Methode zur Bereinigung.
Update (Oktober 2012)
Toubs Blog-Beitrag „Muss ich Aufgaben entsorgen?“ liefert weitere Erläuterungen. In .NET 4.5 weist eine Aufgabe das interne Wartehandle nur zu, wenn AsyncWaitHandle explizit verwendet wird. Darüber hinaus verfügt Task nicht über einen Finalizer. Jedes zugewiesene Handle wird mit einem Finalizer in ein Objekt eingeschlossen. Dies bedeutet, dass die meisten Task-Objekte nicht entsorgt werden müssen.
Schlussfolgerungen
In den meisten Fällen ist es akzeptabel, auf den Aufruf von Dispose() für Task-Objekte zu verzichten, die zum Auslösen verwendet werden -und-vergessen Sie Hintergrundaufgaben. Für die Ressourcenbereinigung reicht in der Regel die Finalisierung aus. Wenn jedoch AsyncWaitHandle verwendet wird oder die Anwendung stark von solchen Aufgaben abhängig ist, kann eine explizite Entsorgung gerechtfertigt sein.
Das obige ist der detaillierte Inhalt vonMuss ich Aufgaben in Fire-and-Forget-Hintergrundoperationen löschen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!