Ich habe ein Programm (C#) mit einer Liste von Tests zu tun.
Auch ich habe zwei thread. eine, um eine Aufgabe in die Liste einzufügen, und eine, um die ausgeführten Aufgaben zu lesen und zu entfernen.
Ich benutze die 'sperren' Funktion jedes Mal, wenn einer der Threads auf die Liste zugreifen möchte.
Eine andere Sache, die ich tun möchte, ist, wenn die Liste leer ist, wird der Thread, der aus der Liste lesen muss, schlafen. und wachen auf, wenn der erste Thread eine Aufgabe zur Liste hinzufügt. Hier ist der Code schrieb ich:sperren gemeinsame Daten mit 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();
}
Anscheinend habe ich es falsch, und es ist nicht wie erwartet durchgeführt (Die readTread does't aus der Liste lesen).
Weiß jemand, was ist mein Problem, und wie man es richtig macht?
Vielen Dank,
Vielen Dank für Ihre schnelle Antwort, ich möchte Ihre Antwort versuchen, aber ich habe nicht die BlockingQueue-Klasse. Muss ich etwas hinzufügen? – menacheb
Atme tief durch und lies noch einmal die Antwort. langsam diesmal. Brian stellt in seiner Antwort einen Link zu einer Implementierung der BlockingQueue-Klasse bereit. –
Eine BlockingQueue-Implementierung ist in .NET 4.0 enthalten. –