У меня есть Список newJobs. Некоторые потоки добавляют элементы к этому списку, а другой поток удаляет из него элементы, если он не пуст. У меня ManualResetEvent newJobEvent, который установлен, когда элементы добавлены в список, и сбрасывается, когда элементы удаляются из него:Проблема многопоточности при проверке списка Count property
Добавление элементов в списке осуществляется следующим образом:
lock(syncLock){
newJobs.Add(job);
}
newJobEvent.Set();
Работа удаление выполняется следующим образом:
if (newJobs.Count==0)
newJobEvent.WaitOne();
lock(syncLock){
job = newJobs.First();
newJobs.Remove(job);
/*do some processing*/
}
newJobEvent.Reset();
Когда линия
job=newJobs.First()
Выполняется
. Иногда я получаю исключение, что список пуст. Я думаю, что чек:
if (newJobs.Count==0)
newJobEvent.WaitOne();
также должны быть в заявлении блокировки, но я боюсь, тупиков на линии newJobEvent.WaitOne();
Как его решить?
Большое спасибо и извините за длинный пост!
Благодарим Брайана за подробный ответ. Это очистило мне всю эту проблему, которая для меня новая. Еще раз спасибо!!! – mayap