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

Jad*_*ias 11 .net multithreading asynchronous thread-safety cookiecontainer

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

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

Mar*_*ell 6

不,并非所有.NET类都是线程安全的.事实上,很少有人需要.通常,静态成员应该是线程安全的,但这是关于它的.

不可变/半不可变对象是自动线程安全的(这包括诸如XslTransform之类的东西) - 并且有一些可变的情况(例如线程容器),你可以期望事物是线程安全的.MSDN声明每个类的线程安全性.

我不希望cookie容器是线程安全的,所以你可能需要自己同步.

(更新)

重申你的第二点; 究竟你想到哪些变量?在异步请求期间,您自己的本地状态变量不会直接更新,因此在处理响应时准备请求时,您只需同步访问即可.最常见的是,通过Monitor- 即

lock(syncLock) {
    // prepare request from (synchronized) state
    req.Begin{...}
}
Run Code Online (Sandbox Code Playgroud)

然后在回调中

lock(syncLock) {
    // ...read values from request...
    // ...update local state...
}
Run Code Online (Sandbox Code Playgroud)

哪里syncLock只是一个锁对象(可能是针对一个实例):

private readonly object syncLock = new object();
Run Code Online (Sandbox Code Playgroud)


Tur*_*key 5

马口:

线程安全

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

编辑:

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