Domanda

Sto usando variabili ThreadStatic per memorizzare alcuni dati, ma sono preoccupato che i dati posso conservare sul filo sarà ancora lì dopo che ho finito con esso e rilasciare di nuovo al ThreadPool. Ho bisogno di preoccuparsi di chiarire i miei variabili ThreadStatic prima che sia finito con il filo? O sarà la ThreadPool fare questo per me prima di "passare fuori" per il prossimo QueueUserWorkItem? Ciò è particolarmente importante per me perché ho bisogno di fare in modo che gli altri thread nel mio app hanno una tabula rasa su cui lavorare in termini di variabili ThreadStatic. Grazie!

È stato utile?

Soluzione

Il pool di thread (da disegno) mantiene i fili vivi tra le chiamate. Ciò significa che le variabili ThreadStatic persisteranno tra le chiamate al QueueUserWorkItem.

Questo comportamento è anche qualcosa che non dovrebbe contare. Il ThreadPool sarà (eventualmente, a sua discrezione) filetti di estrazione indietro e lasciare loro fine, e costruire nuove discussioni, se necessario.

Tuttavia, mi piacerebbe in discussione il vostro disegno, se si sta eseguendo in problemi con questo. Se avete bisogno di dati specifici, ThreadStatic deterministici per essere utilizzato in QueueUserWorkItem, le routine di threading potrebbero essere buoni candidati per fare il lavoro di gestione thread. ThreadStatic e il ThreadPool non sono sempre una grande combinazione - è solo che non necessariamente hanno abbastanza di controllo (dal momento che il ThreadPool gestisce i fili) ad approfittare e ottenere benefici da variabili ThreadStatic. Non saprai mai se due elementi di lavoro saranno sullo stesso thread, diversi thread, e se la variabile ThreadStatic dovrebbe essere (ri) inizializzato, ecc.

Altri suggerimenti

Mi aspetto che rimarrebbero tra i metodi. Naturalmente, in caso di dubbio, reimpostare le variabili filo-statica 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top