Ho il seguente codice:C# Threading/Blocco confusione
var items = new List<string> {"1", "2", "3"}; // 200 items
foreach(var item in items) {
ThreadPool.QueueUserWorkItem((DoWork), item);
}
private void DoWork(object obj)
{
lock(this)
{
using(var sw = File.AppendText(@"C:\somepath.txt")
{
sw.WriteLine(obj);
}
}
}
A causa della filettatura, per qualche motivo, ho un numero casuale di 200 articoli scritti fuori al file. 60 o 127 o talvolta solo 3. Se rimuovo il ThreadPool e scrivo solo all'interno del ciclo foreach originale, tutti i 200 elementi sono scritti correttamente.
Non sai perché questo si verifica?
Grazie per il vostro aiuto.
Un modo per risolvere questo problema è utilizzare Interlocked.Increment per tenere traccia di quante volte viene chiamato DoWork, impostando un evento di reimpostazione automatica quando raggiunge il numero magico. Il thread principale può attendere quell'evento invece di spegnersi. –
Non c'è un modo per dire al thread principale di attendere fino a quando tutti i thread ThreadPool sono stati completati con il lavoro? – shahkalpesh
Il commento di Steven spiega come farlo. –