Sto utilizzando le variabili ThreadStatic per archiviare alcuni dati, ma sono preoccupato che i dati che ho memorizzato sul thread siano ancora lì dopo che ho finito con esso e rilascino al ThreadPool. Devo preoccuparmi di cancellare le variabili ThreadStatic prima che abbia finito il thread? O il ThreadPool farà questo per me prima di "passarlo fuori" per il prossimo QueueUserWorkItem? Questo è particolarmente importante per me perché devo assicurarmi che gli altri thread nella mia app abbiano una lavagna pulita da cui lavorare in termini di variabili ThreadStatic. Grazie!I valori nelle mie variabili ThreadStatic saranno ancora presenti quando sono attivati tramite ThreadPool?
risposta
Il pool di thread (in base alla progettazione) mantiene vivi i fili tra le chiamate. Ciò significa che le variabili ThreadStatic permarranno tra le chiamate a QueueUserWorkItem.
Questo comportamento è anche qualcosa su cui non si dovrebbe contare. Il ThreadPool (alla fine, a sua discrezione) rilascerà i thread e li lascerà finire e costruirà nuovi thread secondo necessità.
Tuttavia, metterei in dubbio il tuo progetto se hai problemi con questo. Se hai bisogno di dati ThreadStatic specifici e deterministici da utilizzare in QueueUserWorkItem, le tue routine di threading potrebbero essere buone candidate per gestire autonomamente il thread. ThreadStatic e ThreadPool non sono sempre un'ottima combinazione: non hai necessariamente un controllo sufficiente (dal momento che ThreadPool gestisce i thread) per trarne vantaggio e ottenere benefici dalle variabili ThreadStatic. Non saprai mai se due elementi di lavoro saranno sullo stesso thread, thread diversi e se la variabile threadstatic deve essere (ri) inizializzata, ecc.
Mi aspetto che rimarrebbero tra i metodi. Ovviamente, in caso di dubbio, reimposta le variabili statiche del thread all'inizio del tuo metodo di lavoro. Oppure utilizzare try
/finally
per cancellare i valori dopo ogni unità di lavoro.
(edit)
E 'abbastanza facile dimostrare che effettivamente rimangono; Quanto sopra si avvia rapidamente la stampa di numeri superiori a 0 (dove 0 ogni volta che è quello che ci si aspetterebbe se i diversi lavoratori sono stati isolati):
[STAThread]
static void Main()
{
for (int i = 0; i < 50; i++)
{
ThreadPool.QueueUserWorkItem(DoStuff);
}
Console.ReadLine();
}
static void DoStuff(object state)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++);
Thread.Sleep(20);
}
[ThreadStatic]
static int value;