2 проблемы.
1) Вам необходимо заблокировать список.Вы должны убедиться, что у вас есть взаимный монопольный доступ к списку, чтобы его нельзя было перечислить во время его изменения.Первое решение состоит в использовании блокировок:
class Mailbox {
List<int> list;
void Send(int a) {
lock(list) {
list.Add(a);
}
}
int Receive() {
lock(list) {
// Enumerate
return ...;
}
}
}
Более элегантно, вы можете использовать одну из новых коллекций в пространстве имен Concurrent , например BlockingCollection .Последний не безопасен для перечисления, но предоставляет метод Take()
, который можно использовать для извлечения объектов из него, пока производители вставляют их.
2) Избегайте создания потоков gazillion,Вы можете использовать .NET пул потоков , чтобы ставить в очередь столько запросов, сколько пожелаете, и фреймворк позаботится о том, чтобы отобразить их в реальных потоках, не убивая систему.