Я использовал цикл foreach для просмотра списка данных для обработки (удаление указанных данных после обработки - это было внутри блокировки). Этот метод время от времени вызывал исключение ArgumentException.
Поймать это было бы дорого, поэтому я попытался отследить проблему, но не смог ее понять.
С тех пор я переключился на цикл for, и проблема, похоже, исчезла. Может кто-нибудь объяснить, что произошло? Даже с сообщением об исключении я не совсем понимаю, что происходило за кулисами.
Почему цикл for явно работает? Я неправильно настроил цикл foreach или что?
Примерно так были настроены мои петли:
foreach (string data in new List<string>(Foo.Requests))
{
// Process the data.
lock (Foo.Requests)
{
Foo.Requests.Remove(data);
}
}
а также
for (int i = 0; i < Foo.Requests.Count; i++)
{
string data = Foo.Requests[i];
// Process the data.
lock (Foo.Requests)
{
Foo.Requests.Remove(data);
}
}
РЕДАКТИРОВАТЬ: цикл for * настроен так:
while (running)
{
// [...]
}
РЕДАКТИРОВАТЬ: добавлена дополнительная информация об исключении по запросу.
System.ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds
at System.Array.Copy (System.Array sourceArray, Int32 sourceIndex, System.Array destinationArray, Int32 destinationIndex, Int32 length) [0x00000]
at System.Collections.Generic.List`1[System.String].CopyTo (System.String[] array, Int32 arrayIndex) [0x00000]
at System.Collections.Generic.List`1[System.String].AddCollection (ICollection`1 collection) [0x00000]
at System.Collections.Generic.List`1[System.String]..ctor (IEnumerable`1 collection) [0x00000]
РЕДАКТИРОВАТЬ: Причина блокировки в том, что есть еще один поток, добавляющий данные. Кроме того, в конечном итоге данные будут обрабатывать более одного потока (поэтому, если вся настройка неверна, сообщите об этом).
РЕДАКТИРОВАТЬ: Было сложно выбрать хороший ответ.
Я нашел комментарий Эрика Липперта заслуживающим внимания, но он на самом деле не ответил (все равно проголосовал за его комментарий).
Павел Минаев, Джоэл Кохорн и Торарин дали ответы, которые мне понравились и за которые я проголосовал. Торарин также потратил 20 минут на то, чтобы написать полезный код.
Я мог принять все 3, и это разбило репутацию, но, увы.
Павел Минаев - следующий заслуженный, поэтому он получает признание.
Спасибо за помощь людям добрым. :)