Во-первых, эта публикация SO не отвечает, так как она описывает простые / базовые проблемы со ссылками на объекты. То, что я испытываю, связано с многопоточной асинхронной обработкой, которая не решается в другом посте.
У меня есть многопоточное приложение .NET winforms, и я делаю это:
if ( paramList != null ) {
lock ( paramList ) {
foreach ( DictionaryEntry param in paramList ) {
command.Parameters.AddWithValue(param.Key.ToString(), param.Value);
}
}
}
paramList
- это OrderedDictionary
.
. Я периодически получаю эту ошибку в строке foreach
:
Ссылка на объект не установлена на экземпляр объекта.
Как видите, param.Key
равно нулю, а param.Value
равно нулю. Но это не имеет смысла, потому что в paramList
нет нулей, как вы можете видеть здесь:
На скриншоте вы можете видеть только индекс2, но я также исследовал индексы 0 и 1, то же самое, действительные данные, без нулей.
У меня нет опыта работы с многопоточными приложениями, но я поместил этот блок в lock()
из-за ответов в это ТАК сообщение . Перед установкой lock()
я время от времени получал ошибку Collection was modified; enumeration operation may not execute.
После установки блокировки эта ошибка исчезла, но теперь я получаю ссылку на объект, как показано выше.
Что я могу сделатьЧтобы решить эту проблему?
РЕДАКТИРОВАТЬ
Воспользовавшись советом нескольких плакатов, я сделал это:
private static object syncLock = new object();
и затем в использовании:
lock ( syncLock ) {
if ( paramList != null ) {
foreach ( DictionaryEntry param in paramList ) {
command.Parameters.AddWithValue(param.Key.ToString(), param.Value);
}
}
}
Это, похоже, решило ошибку ссылки на объект (спасибо всем), но теперь я время от времени получаю:
Коллекция была изменена;Операция перечисления может не выполняться.
Поскольку после использования этого нового подхода я получил совершенно другую ошибку, я создал новый вопрос SO . Я не уверен, что это было правильно, потому что теперь кажется, что эти проблемы связаны, и я просто вижу разные симптомы одной и той же основной проблемы.
Все еще ищу решение, если у кого-то есть идеи.