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

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

4

5 回答 5

6

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

不可变/半不可变对象是自动线程安全的(这包括 XslTransform 等) - 在少数可变情况下(例如线程容器),您可以期望事情是线程安全的。MSDN 声明每个类的线程安全。

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

(更新)

再说你的第二点;您到底在考虑哪些变量?您自己的本地状态变量不会在异步请求期间直接更新,因此您只需在准备请求和处理响应时同步访问即可。最常见的是,通过 a Monitor- ie

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();
于 2008-12-28T15:07:46.207 回答
5

马嘴里

线程安全

此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

编辑:

您可以锁定修改实例成员的操作。

于 2008-12-28T14:51:36.600 回答
4

正如我所看到的(在反射器的帮助下),CookieContainer 在内部使用锁来访问其成员,因此尽管有文档,它应该是线程安全的。

顺便说一句,它根本没有公共静态成员。所以在我看来,文档只提供了一个标准通知。

于 2015-04-02T13:45:24.333 回答
2

请注意,网页会发送修改后的 cookie 列表作为其 HTTP 回复的一部分。在发送回复后修改 CookieContainer 不会完成任何事情——您只需修改不再存在的页面请求的 cookie 集合。

于 2008-12-31T17:47:54.293 回答
0

Microsoft 保证 .NET 框架中的所有静态类都是线程安全的。

您可以使用 Reflector 来验证这一点。

于 2008-12-28T16:35:30.460 回答