Tengo un programa (C#) con una lista de pruebas para hacer.
Además, tengo dos hilos. uno para agregar tareas a la lista, y otra para leer y eliminar las tareas realizadas.
Estoy usando la función 'bloquear' cada vez que uno de los hilos desea acceder a la lista.
Otra cosa que quiero hacer es, si la lista está vacía, el hilo que necesita leer de la lista dormirá. y se despierta cuando el primer subproceso agrega una tarea a la lista. Aquí está el código que he escrito:bloquear datos compartidos usando C#
...
List<String> myList = new List();
Thread writeThread, readThread;
writeThread = new Thread(write);
writeThread.Start();
readThraed = new Thread(read);
readThread.Start();
...
private void write()
{
while(...)
{
...
lock(myList)
{
myList.Add(...);
}
...
if (!readThread.IsAlive)
{
readThraed = new Thread(read);
readThread.Start();
}
...
}
...
}
private void read()
{
bool noMoreTasks = false;
while (!noMoreTasks)
{
lock (MyList)//syncronize with the ADD func.
{
if (dataFromClientList.Count > 0)
{
String task = myList.First();
myList.Remove(task);
}
else
{
noMoreTasks = true;
}
}
...
}
readThread.Abort();
}
Al parecer lo hice mal, y no se lleva a cabo como se esperaba (El readTread does't leer de la lista).
¿Alguien sabe cuál es mi problema y cómo hacerlo bien?
Muchas gracias,
Gracias por su respuesta rápida, quiero probar su respuesta, pero no tengo la clase BlockingQueue. ¿Debo agregar algo de uso? – menacheb
Respire profundamente y lea la respuesta una vez más; lentamente esta vez Brian proporciona un enlace a una implementación de la clase BlockingQueue en su respuesta. –
Se incluye una implementación de BlockingQueue en .NET 4.0. –