Ist es akzeptabel, Dispose () für ein TPL-Task-Objekt nicht aufzurufen?
Ich möchte eine Aufgabe auslösen, die in einem Hintergrundthread ausgeführt wird. Ich möchte nicht auf den Abschluss der Aufgaben warten.
In .net 3.5 hätte ich das gemacht:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
In .net 4 ist die TPL der vorgeschlagene Weg. Das übliche empfohlene Muster ist:
Task.Factory.StartNew(() => { DoSomething(); });
DerStartNew()
Methode gibt ein @ zurüTask
Objekt, das @ implementieIDisposable
. Dies scheint von Leuten übersehen zu werden, die dieses Muster empfehlen. Die MSDN-Dokumentation auf demTask.Dispose()
Methode sagt:
"Rufen Sie immer Dispose an, bevor Sie Ihren letzten Verweis auf die Aufgabe freigeben."
Sie können dispose für eine Aufgabe erst dann aufrufen, wenn sie abgeschlossen ist. Wenn Sie also den Haupt-Thread warten und dispose aufrufen, hat dies in erster Linie keine Auswirkung auf einen Hintergrund-Thread. Es scheint auch kein abgeschlossenes Ereignis zu geben, das für die Bereinigung verwendet werden könnte.
Die MSDN-Seite in der Task-Klasse kommentiert dies nicht, und das Buch "Pro C # 2010 ..." empfiehlt dasselbe Muster und macht keinen Kommentar zur Task-Entsorgung.
Ich weiß, wenn ich es einfach lasse, wird der Finalizer es am Ende fangen, aber wird das zurückkommen und mich beißen, wenn ich viele Feuer- und Vergessensaufgaben wie diese mache und der Finalizer-Thread überfordert wird?
Also meine Fragen sind:
Ist es akzeptabel, @ nicht anzurufDispose()
auf derTask
Klasse in diesem Fall? Und wenn ja, warum und gibt es Risiken / Konsequenzen? Gibt es eine Dokumentation, die dies bespricht? Oder gibt es eine geeignete Möglichkeit, das @ zu entsorgeTask
Objekt, das ich verpasst habe? Oder gibt es eine andere Möglichkeit, mit der TPL Fire & Forgetasks auszuführen?