Wenn Sie mit der Task Parallel Library (TPL) arbeiten, um Hintergrundaufgaben zu initiieren, ohne auf deren Abschluss zu warten, stellt sich die Frage, ob Die Entsorgung des zurückgegebenen Task-Objekts ist unerlässlich. Dieser Artikel zielt darauf ab, dieses Problem anzugehen und die Auswirkungen zu untersuchen, wenn die Dispose()-Methode nicht aufgerufen wird.
In TPL gibt die StartNew()-Methode ein Task-Objekt zurück welches die IDisposable-Schnittstelle implementiert. In der MSDN-Dokumentation für Task.Dispose() wird darauf hingewiesen, wie wichtig es ist, Dispose aufzurufen, bevor der letzte Verweis auf die Aufgabe freigegeben wird.
Eine Sorge besteht darin, dass das Task-Objekt möglicherweise zuweist Nicht verwaltete Ressourcen wie Wartehandles, die explizit über Dispose() freigegeben werden müssen, um Speicherlecks zu vermeiden. Stephen Toub, ein Mitglied des Microsoft pfx-Teams, stellt jedoch klar, dass dieses Szenario unwahrscheinlich ist.
Laut Toub weisen Task-Objekte nur dann ein Ereignishandle zu, wenn das Warten auf sie eine Blockierung erfordert (anstatt sie zu drehen oder auszuführen). wartende Aufgabe). Bei der Verwendung von Fortsetzungen wird dieses Ereignishandle nie zugewiesen.
Wenn der Finalizer nicht explizit aufgerufen wird, fordert er schließlich alle nicht verwalteten Ressourcen zurück, die einem Task-Objekt zugeordnet sind. Es ist jedoch möglicherweise nicht ideal, sich auf die Finalisierung zu verlassen, insbesondere wenn eine große Menge an Fire-and-Forget-Aufgaben bearbeitet wird, da dadurch der Finalizer-Thread überlastet werden kann.
Zusammenfassend das Allgemeine Konsens besteht darin, dass die Entsorgung von Task-Objekten in den meisten Szenarien normalerweise nicht erforderlich ist. Die folgenden Empfehlungen bieten Orientierung:
Das obige ist der detaillierte Inhalt vonSollte ich Aufgabenobjekte in der TPL entsorgen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!