Когда словарь создает исключение IndexOutOfRangeException для Add или ContainsKey? - PullRequest
22 голосов
/ 17 декабря 2009

На загруженном веб-сайте ASP .NET у меня есть словарь, который действует как кеш, в основном храня пары ключ / значение для последующего поиска.

При высокой нагрузке Словарь иногда попадает в состояние, когда он всегда генерирует исключение IndexOutOfRangeException при каждом вызове метода ContainsKey или Add. Исключение происходит внутри частного метода FindEntry.

Я подозреваю, что это может быть связано с проблемой синхронизации, но я не уверен.

Может кто-нибудь сказать мне, при каких обстоятельствах это может произойти? Моя цель - собрать достаточно информации, чтобы я мог воспроизвести проблему в среде разработчика.

Ответы [ 3 ]

21 голосов
/ 17 декабря 2009

Документация для Словарь гласит:

Любые члены экземпляра не гарантируют поточно-ориентированность.

Чтобы разрешить доступ к коллекции из нескольких потоков для чтения и записи, необходимо реализовать собственную синхронизацию.

Если вы не синхронизируете доступ к Dictionary, то у вас могут возникнуть проблемы, подобные тем, которые вы описываете (предположительно, потому что внутреннее состояние больше не действует). Если вы хотите воспроизвести это в своей среде разработки, попробуйте создать программу, которая использует несколько потоков для непрерывного чтения и записи из Dictionary без синхронизации.

1 голос
/ 17 декабря 2009

Я согласен, что это почти наверняка проблема синхронизации.

Мне неизвестна какая-либо документация, в которой точно описано, когда и как это может происходить - поведение не определено, если вы используете словарь без поточной защиты.

Для тестирования в вашей среде разработки я бы предложил запустить несколько параллельных потоков, которые случайным образом вставляют, удаляют, обновляют и т. Д. В непрерывном цикле (в основном, «концентрированная» версия того, что происходит в вашей производственной среде).

0 голосов
/ 17 декабря 2009

Вот многопоточный словарь http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx также зацените этот ТАК вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...