2009-02-18 5 views
10

Werden Hintergrundarbeiter-Threads wiederverwendet?Ist thread-lokaler Speicher zwischen Hintergrundarbeiteraufrufen persistent?

Insbesondere, wenn ich einen benannten Datensteckplatz (Thread-lokalen Speicher) während der DoWork() -Methode eines Hintergrundarbeiters festlegen, bleibt der Wert dieses Datensteckplatzes erhalten, möglicherweise zu einem späteren Zeitpunkt ein anderer Thread sein ?

würde ich so nicht gedacht, aber ich habe diesen Fehler ...

EDIT: This blog post schlägt vor, dass BackGroundWorker ein ThreadPool verwendet, was bedeutet, dass Threads ist wiederverwendet. So wird die Frage; Speichern wiederverwendete Threads Thread-lokalen Speicher möglicherweise zwischen Aufrufen?

Antwort

7

Wenn der Thread-Pool einen Thread wiederverwendet, werden die Daten im lokalen Thread-Speicher oder in Feldern, die mit dem ThreadStaticAttribute-Attribut markiert sind, nicht gelöscht. Daher können Daten, die von einer Methode in lokalen Thread-Speicher abgelegt werden, einer anderen Methode ausgesetzt werden, die von demselben Thread-Pool-Thread ausgeführt wird. Eine Methode, die auf ein Feld zugreift, das mit dem ThreadStaticAttribute-Attribut markiert ist, kann abhängig davon, welcher Threadpool-Thread es ausführt, unterschiedliche Daten finden.

Quelle: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

0

Müsste die Quelle (oder über Reflector) überprüfen, um dies festzustellen, wenn es nicht in MSDN angegeben ist.

Wenn es nicht angegeben ist, können Sie sich nicht darauf verlassen, dass sich das aktuelle Verhalten in einer zukünftigen Version von .NET nicht ändert.

Edit: Sieht aus wie es den Thread-Pool verwendet, so Threads wird wiederverwendet werden.

4

Nun, intern BackgroundWorker verwendet BeginInvoke was bedeutet, (I ) glauben, dass es einen der Threads aus dem ThreadPool verwenden. Ob TLS gelöscht wird, wenn Threads an den Pool zurückgegeben werden, kann ich nicht sicher sagen.

Als Reaktion auf die Bearbeitung schlägt nichts, was ich in Reflector gesehen habe, vor, dass TLS-Slots gelöscht oder freigegeben werden, sobald sie in den Pool zurückgegeben werden. Sie müssen diese also explizit löschen, bevor Ihre Methode DoWork zurückgibt.

+2

TLS nicht gelöscht, wenn der Thread-Pool zu Gewinde gibt „Wenn der Thread-Pool einen Thread wieder verwendet, ist es nicht die Daten im lokalen Thread-Speicher zu löschen oder in Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind. Wenn eine Methode lokalen Threadspeicher oder Felder untersucht, die mit dem ThreadStaticAttribute-Attribut markiert sind, können die gefundenen Werte daher von einer früheren Verwendung des Threadpoolthreads übrig bleiben. " 'QUELLE: [link] (http://msdn.microsoft.com/enus/library/system.threading.threadpool.aspx)' – Taher