.net - .NET System.Net.CookieContainer 线程安全吗?

标签 .net multithreading asynchronous thread-safety cookiecontainer

  1. .NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复--
  2. 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.CookieContainer)的线程安全性?
  3. 是否有任何属性可以突出显示线程安全类? --更新:如果 MSDN 上描述了线程安全性,那么它们可能没有相应的属性 --
  4. 所有 .NET 类都是线程安全的吗? --更新:马克回答--

我问这些问题是因为我在多线程代码的异步请求中使用 CookieContainer。而且我无法将异步请求放入锁内。也许我必须像 F# 中那样使用只读“变量”(或不可变类型),对吗?

最佳答案

不,并非所有 .NET 类都是线程安全的。事实上,很少有人有必要这样做。一般来说,静态成员应该是线程安全的,但仅此而已。

不可变/半不可变对象(immutable对象)自动是线程安全的(这包括 XslTransform 等) - 并且在少数可变情况(例如线程容器)中您可以期望事物是线程安全的。 MSDN 规定了每个类的线程安全性。

我不期望 cookie 容器是线程安全的,因此您可能必须自己同步它。

(已更新)

回复你的第二点;您到底在考虑哪些变量?您自己的本地状态变量不会在异步请求期间直接更新,因此您只需在准备请求和处理响应时同步访问即可。最常见的是,通过 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();

关于.net - .NET System.Net.CookieContainer 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396222/

相关文章:

c# - 温莎城堡 Nhibernate 设施延迟加载

c - 如何在 Linux + GLibc 上取消线程的当前任务并将线程重置为已知的良好状态,而无需任何动态分配?

angular - 如何将完成的回调与注入(inject) Angular 2单元测试结合起来

javascript - 异步回调 JavaScript

c# - 关于异步返回类型

C# Entity Framework 属性(有时)为空

c# - 在 LINQ to Entities 中使用未建模的对象集合

.net - 在 .Net 中, "most terse"检查字符串是否为多个值之一的方法?

java - Android:在两个线程之间共享列表

c++ - (Qt5,线程)我正在关注的示例不起作用