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

2023-12-26

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

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


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

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

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

(更新)

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

lock(syncLock) {
    // prepare request from (synchronized) state
    req.Begin{...}
}

然后在回调中

lock(syncLock) {
    // ...read values from request...
    // ...update local state...
}

Where syncLock只是一个锁对象(可能针对实例持有):

private readonly object syncLock = new object();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET System.Net.CookieContainer 线程安全吗? 的相关文章

随机推荐