Dot-Net
.NET System.Net.CookieContainer 執行緒安全嗎?
- .NET 類 System.Net.CookieContainer 執行緒安全嗎?–**更新:**交鑰匙回答–
- 有什麼方法可以確保在非同步請求期間修改的變數(即 HttpWebRequest.CookieContainer)的執行緒安全性?
- 是否有任何屬性可以突出執行緒安全類?–**更新:**如果 MSDN 上描述了執行緒安全,那麼他們可能沒有這個屬性 –
- 所有 .NET 類都是執行緒安全的嗎?–**更新:**馬克回答了–
我問這些問題是因為我在多執行緒程式碼的非同步請求中使用了 CookieContainer。而且我不能將非同步請求放入鎖中。也許我必須像在 F# 中那樣使用只讀“變數”(或不可變類型),對吧?
不,並非所有 .NET 類都是執行緒安全的。事實上,很少有人需要。一般來說,靜態成員應該是執行緒安全的,但僅此而已。
不可變/半不可變對像是自動執行緒安全的(這包括 XslTransform 等) - 在少數可變的情況下(例如執行緒容器),您可以期望事情是執行緒安全的。MSDN 聲明每個類的執行緒安全。
我不希望 cookie 容器是執行緒安全的,因此您可能必須自己同步它。
(更新)
再說你的第二點;您到底在考慮哪些變數?您自己的本地狀態變數不會在非同步請求期間直接更新,因此您只需在準備請求和處理響應時同步訪問即可。最常見的是,通過 a
Monitor- ielock(syncLock) { // prepare request from (synchronized) state req.Begin{...} }然後在回調中
lock(syncLock) { // ...read values from request... // ...update local state... }哪裡
syncLock只是一個鎖定對象(可能針對一個實例持有):private readonly object syncLock = new object();