Ho un programma (C#) con un elenco di test da fare.
Inoltre, ho due thread. uno per aggiungere attività all'elenco e uno per leggere e rimuovere da esso le attività eseguite.
Sto usando la funzione 'blocca' ogni volta che uno dei thread vuole accedere alla lista.
Un'altra cosa che voglio fare è, se la lista è vuota, il thread che ha bisogno di leggere dalla lista dormirà. e svegliarsi quando il primo thread aggiunge un'attività all'elenco. Ecco il codice che ho scritto:bloccare i dati condivisi utilizzando 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();
}
A quanto pare ho fatto male, e non è eseguito come previsto (Il readTread does't leggere dalla lista).
Qualcuno sa qual è il mio problema e come farlo bene?
Molte grazie,
Grazie per la risposta rapida, voglio provare la risposta, ma io non ho la classe BlockingQueue. Devo aggiungere un po 'usando? – menacheb
Fai un respiro profondo e leggi la risposta ancora una volta; lentamente questa volta. Brian fornisce un collegamento a un'implementazione della classe BlockingQueue nella sua risposta. –
Un'implementazione BlockingQueue è inclusa in .NET 4.0. –