Подожди минутку - думаю, мы все упустили момент.
Классы коллекции не являются поточно-ориентированными. Если доступ к коллекции осуществляется несколькими потоками без блокировки потоков, вам необходимо это исправить. Это особенно коварная проблема, потому что она будет работать правильно [редактировать - или выдавать предсказуемое исключение] 99,999% времени, а в 0,001% случаев она будет делать что-то совершенно непредсказуемое и почти невозможно воспроизвести.
Простой подход заключается в использовании операторов lock {} в КАЖДОМ месте, где ЛЮБОЙ код получает доступ к коллекции. Это может быть небольшим излишним, но это самый безопасный план. Для итерации вы можете либо поставить блокировку вокруг всего цикла, либо, если вы не хотите блокировать другие потоки так долго, просто заблокируйте их достаточно долго, чтобы сделать снимок:
object[] snap;
lock (list)
{
snap = list.ToArray();
}
foreach (object x in snap) ...