- .NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复--
- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.CookieContainer)的线程安全性?
- 是否有任何属性可以突出显示线程安全类? --更新:如果 MSDN 上描述了线程安全性,那么它们可能没有相应的属性 --
- 所有 .NET 类都是线程安全的吗? --更新:马克回答--
我问这些问题是因为我在多线程代码的异步请求中使用 CookieContainer。而且我无法将异步请求放入锁内。也许我必须像 F# 中那样使用只读“变量”(或不可变类型),对吗?
最佳答案
不,并非所有 .NET 类都是线程安全的。事实上,很少有人有必要这样做。一般来说,静态成员应该是线程安全的,但仅此而已。
不可变/半不可变对象(immutable对象)自动是线程安全的(这包括 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();
关于.net - .NET System.Net.CookieContainer 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396222/