Tengo el siguiente código:C# Roscado/bloqueo confusión
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);
}
}
}
Debido a la rosca, por alguna razón, me sale un número al azar de los 200 artículos escritos a cabo en el fichero. 60 o 127 o, a veces, solo 3. Si elimino el ThreadPool y solo escribo dentro del bucle foreach original, todos los 200 elementos se escriben con éxito.
¿No está seguro de por qué ocurre esto?
Gracias por su ayuda.
Una forma de solucionar esto es utilizar Interlocked.Increment para realizar un seguimiento de cuántas veces se llama a DoWork, estableciendo un evento de restablecimiento automático cuando se alcanza el número mágico. El hilo principal puede esperar ese evento en lugar de apagarse. –
¿No hay una forma de decirle al hilo principal que espere hasta que todos los hilos de ThreadPool hayan terminado con el trabajo? – shahkalpesh
El comentario de Steven explica cómo hacerlo. –