Является ли .NET System.Net.CookieContainer потокобезопасным? - PullRequest
10 голосов
/ 28 декабря 2008
  1. Безопасен ли поток .NET класса System.Net.CookieContainer? - Обновление: Ответ под ключ -
  2. Есть ли способ обеспечить безопасность потока для переменных, которые изменяются во время асинхронных запросов (например, HttpWebRequest.CookieContainer)?
  3. Есть ли какой-нибудь атрибут для выделения потоковых классов? - Обновление: Если в MSDN описана безопасность потоков, то, вероятно, у них нет атрибута для этого -
  4. Все ли классы .NET безопасны для потоков? - Обновление: Марк ответил -

Я задаю эти вопросы, потому что я использую CookieContainer в асинхронных запросах в многопоточном коде. И я не могу поместить асинхронный запрос в замок. Может быть, мне придется использовать только для чтения «переменные» (или неизменяемые типы), как в F #, верно?

Ответы [ 5 ]

6 голосов
/ 28 декабря 2008

Нет, не все классы .NET являются поточно-ориентированными. На самом деле, очень немногие нуждаются в этом. В целом, статические члены должны быть поточно-ориентированными, но это все.

Неизменяемые / полузаменяемые объекты автоматически поточнобезопасны (это включает в себя такие вещи, как XslTransform и т. Д.) - и есть несколько изменчивых случаев (например, многопоточных контейнеров), где можно ожидать, что вещи будут поточно-ориентированными. MSDN заявляет о безопасности потоков для каждого класса.

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

(обновлено)

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

lock(syncLock) {
    // prepare request from (synchronized) state
    req.Begin{...}
}

и затем в обратном вызове

lock(syncLock) {
    // ...read values from request...
    // ...update local state...
}

Где syncLock - это просто объект блокировки (возможно, удерживаемый против экземпляра):

private readonly object syncLock = new object();
5 голосов
/ 28 декабря 2008

Изо рта лошади :

Безопасность потоков

Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Ни один из членов экземпляра не гарантированно является потокобезопасным.

Edit:

Вы можете заблокировать действия, которые изменяют элементы экземпляра.

3 голосов
/ 02 апреля 2015

Как я вижу (с помощью Reflector), CookieContainer внутренне использует блокировки для доступа к своим членам, поэтому он должен быть поточно-ориентированным, несмотря на документацию.

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

2 голосов
/ 31 декабря 2008

Просто примечание, веб-страница отправляет модифицированный список файлов cookie в качестве части своего ответа HTTP. Изменение CookieContainer после отправки ответа ничего не даст - вы просто измените коллекцию cookie запроса страницы, которого больше не существует.

0 голосов
/ 28 декабря 2008

Все статические классы в .NET Framework гарантированы Microsoft как поточно-ориентированные.

Вы можете проверить это с помощью Reflector.

...