Нет, не все классы .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();