Heim >Backend-Entwicklung >C++ >Sollte ich Fire-and-Forget-TPL-Aufgaben entsorgen ()?
Bei der Verwendung von Task-Objekten für Fire-and-Forget-Aufgaben stellt sich die Frage: Ist es notwendig, Dispose aufzurufen? ()?
Hintergrund-Thread-Ausführung und Task.Dispose()
Die Task Parallel Library (TPL) ermöglicht die Ausführung von Aufgaben in Hintergrundthreads. Typischerweise wird StartNew() verwendet, um ein Task-Objekt zu erstellen, das IDisposable implementiert. Laut MSDN-Dokumentation wird empfohlen, Dispose() aufzurufen, bevor der letzte Verweis auf die Aufgabe freigegeben wird.
Dilemma der Entsorgung von Hintergrundaufgaben
Der Aufruf von Dispose() erfordert jedoch die zu erledigende Aufgabe, was den Zweck der Verwendung eines Hintergrundthreads zunichte macht. Darüber hinaus gibt es kein Abschlussereignis, das zur Bereinigung verwendet werden kann.
Ist es akzeptabel, nicht zu entsorgen()?
Laut Stephen Toub von Microsoft in den meisten Fällen ist es akzeptabel, Dispose() nicht für Task-Objekte aufzurufen, die für Fortsetzungen verwendet werden, da diese das interne Wartehandle nicht zuweisen. Ab .Net 4.5 führt nur die explizite Verwendung von AsyncWaitHandle zu einer Wait-Handle-Zuweisung.
Konsequenzen und Risiken
Toub weist darauf hin, dass Task-Objekte selbst keine Finalizer haben . Das Wartehandle verfügt über einen Finalizer, der jedoch nur bei Bedarf zugewiesen wird. Daher wird der Finalizer nicht ausgeführt, es sei denn, das Wartehandle ist zugewiesen.
In Fällen, in denen viele Fire-and-Forget-Aufgaben erstellt werden, besteht jedoch die Möglichkeit, dass der Finalizer-Thread überlastet wird, wenn mehrere vorhanden sind Wartehandles werden zugewiesen.
Dokumentation und Best Practices
Die MSDN-Seite für die Task-Klasse tut dies gehen dieses Problem nicht explizit an. Stephen Toubs Blogbeitrag mit dem Titel „Muss ich Aufgaben entsorgen?“ liefert jedoch weitere Erläuterungen und empfiehlt, in den meisten Fällen auf die Finalisierung zu setzen.
Alternative Ansätze
Falls gewünscht, gibt es Möglichkeiten, die Verfügbarkeit des Wartehandles zu prüfen und die Aufgabe zu verwerfen, wenn sie zugewiesen wurde. Alternativ könnte man andere Optionen für Fire-and-Forget-Aufgaben erkunden, etwa die ThreadPool.QueueUserWorkItem-Methode oder die Verwendung der Reactive Extensions für .NET (Rx).
Das obige ist der detaillierte Inhalt vonSollte ich Fire-and-Forget-TPL-Aufgaben entsorgen ()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!