Подтвердить что ты не робот

Список <T> одновременное удаление и добавление

Я не уверен, поэтому я подумал, что спрошу. Будет ли удаление и добавление элементов в объект System.Collections.Generic.List<> небезопасным?

Моя ситуация:

Когда соединение получено, оно добавляется в список, но в то же время есть рабочий, который удаляет мертвые соединения и т.д.

Есть ли проблема? Будет ли lock делать? Я также хочу знать, разрешено ли мне использовать блокировку объекта списка с помощью метода Foreach<>.

4b9b3361

Ответ 1

Да, добавление и удаление элементов из List<> не является потокобезопасным, поэтому вам нужно синхронизировать доступ, например, используя lock.

Помните, что ключевое слово lock никак не блокирует объект, который вы используете в качестве идентификатора, он только предотвращает одновременный ввод двух потоков в один и тот же блок кода. Вам понадобятся блокировки всего кода, который обращается к списку, используя тот же объект, что и идентификатор.

Ответ 2

На момент вопроса еще не было .NET Framework 4, но люди, столкнувшиеся с проблемой сейчас, должны попытаться использовать коллекции из пространства имен System.Collections.Concurrent для работы с потокобезопасные проблемы

Ответ 3

List<T> не является потокобезопасным, так что да, вам нужно будет контролировать доступ к списку с помощью блокировки. Если у вас есть несколько потоков, обращающихся к списку, убедитесь, что вы все уважаете блокировку или у вас возникнут проблемы. Лучший способ сделать это - подклассы списка, чтобы блокировка происходила автоматически, иначе вы, скорее всего, в конце концов забудете об этом.

Ответ 4

Собственно, иногда List < > является потокобезопасным, а иногда и нет, согласно Microsoft:

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

но эта страница продолжает:

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

Ответ 5

Определенно использование блокировки для конкретного кода делает его потокобезопасным, но я не согласен с ним в текущем сценарии.

Вы можете реализовать метод Synchronized, чтобы сделать потоки коллекции безопасными. Эта ссылка объясняет, почему и как это сделать.

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

btw, одна из самых больших проблем заключается в том, что вы пытаетесь сохранить что-то вроде пула соединений? если да, то почему?

Я возвращаю свой ответ. Использование блокировок в лучшем ответе на использование этого метода.