Я получаю следующее исключение, когда я звоню datatable.Copy()
, и я не уверен, почему. Я применил блокировку, чтобы избежать этой проблемы, но она, похоже, не исправила ее. Исключение не происходит последовательно, поэтому я знаю, что это связано с потоковой обработкой. Я не понимаю, как работают замки?Коллекция была изменена исключение из datatable.Copy()
System.InvalidOperationException: коллекция была изменена; операция перечисления может не выполняться. на System.Data.RBTree`1.RBTreeEnumerator.MoveNext() в System.Data.DataTable.Copy()
Код:
DataTable dt;
lock (ClassName.datatable)
{
dt = ClassName.datatable.Copy();
}
ClassName
представляет собой тип, а не объект (была некоторая путаница в моем предыдущем вопросе).
Вы используете один и тот же замок * везде * используйте модификацию или прочитайте таблицу? –
Нет, я не думаю, что знаю. Блокирует ли блокировка() только блокировки блокировки()? Если так, то это, скорее всего, моя ошибка. – BlargleMonster
Да, да. (Ну, или звонки на «Monitor.Enter» для одного и того же монитора.) Очень важно четко понять, что делает «lock», прежде чем двигаться дальше. Вы хотите, чтобы я добавил это (с более подробной информацией) в качестве ответа? –