繁体   English   中英

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

[英]Is .NET System.Net.CookieContainer thread safe?

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

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

不,并非所有.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();

马口

线程安全

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

编辑:

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

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

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

只是一个注释,一个网页发送一个修改过的cookie列表作为其HTTP回复的一部分。 在发送回复后修改CookieContainer将无法完成任何操作 - 您只需修改不再存在的页面请求的cookie集合。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM