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

我提出这些问题,因为我在一个多线程的代码异步请求使用的CookieContainer。我不能把一个异步的请求放在一个锁中。也许我必须使用只读的“变量”(或不可变的类型),如在F#中,对吧?.NET System.Net.CookieContainer线程安全吗?

+0

我会更新重新第二,只是为了勾选一切... – 2008-12-28 18:20:36

回答

4

不,不是所有的.NET类都是线程安全的。事实上,很少有需要。一般来说,静态成员应该是线程安全的,但这是关于它的。

不可变/半不可变对象自动线程安全(这包括像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(); 
+0

我不知道HttpWebRequest.CookieContainer更新哪一点,但我想它是在异步请求期间。 – 2008-12-28 18:39:36

+0

那么,你需要从同一个对象发出并发请求吗?你不能有多个HttpWebRequest对象与单独的Cookie容器?那么就没有冲突。 – 2008-12-28 20:56:47

5

horses mouth

线程安全

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

编辑:

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

0

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

您可以使用Reflector进行验证。

1

只是一个说明,网页发送一个修改后的cookie列表作为其HTTP答复的一部分。在发送回复之后修改CookieContainer将无法完成任何事情 - 您只需修改不再存在的页面请求的Cookie集合即可。

2

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

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