Mam program (C#) z listą testów do zrobienia.
Mam również dwa wątki. jeden, aby dodać zadanie do listy i jeden do odczytania i usunięcia z niego wykonanych zadań.
Używam funkcji "blokowania" za każdym razem, gdy jeden z wątków chce uzyskać dostęp do listy.
Inną rzeczą, którą chcę zrobić, to, że jeśli lista jest pusta, wątek, który trzeba odczytać z listy, będzie uśpiony. i obudzić się, gdy pierwszy wątek doda zadanie do listy. Oto kod pisałem:blokowanie udostępnionych danych przy użyciu 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();
}
Najwyraźniej zrobiłam to źle, a to nie jest wykonywane zgodnie z oczekiwaniami (The readTread does't odczytać z listy).
Czy ktoś wie, jaki jest mój problem i jak go naprawić?
Wielkie dzięki,
Dziękuję za szybką odpowiedź, chcę spróbować odpowiedzi, ale nie mam klasy BlockingQueue. Czy muszę dodać trochę za pomocą? – menacheb
Weź głęboki oddech i przeczytaj odpowiedź jeszcze raz; powoli tym razem. W odpowiedzi Brian podaje link do implementacji klasy BlockingQueue. –
Implementacja BlockingQueue jest zawarta w .NET 4.0. –