Dot-Net

.NET System.Net.CookieContainer 執行緒安全嗎?

  • April 2, 2015
  1. .NET 類 System.Net.CookieContainer 執行緒安全嗎?–**更新:**交鑰匙回答–
  2. 有什麼方法可以確保在非同步請求期間修改的變數(即 HttpWebRequest.CookieContainer)的執行緒安全性?
  3. 是否有任何屬性可以突出執行緒安全類?–**更新:**如果 MSDN 上描述了執行緒安全,那麼他們可能沒有這個屬性 –
  4. 所有 .NET 類都是執行緒安全的嗎?–**更新:**馬克回答了–

我問這些問題是因為我在多執行緒程式碼的非同步請求中使用了 CookieContainer。而且我不能將非同步請求放入鎖中。也許我必須像在 F# 中那樣使用只讀“變數”(或不可變類型),對吧?

不,並非所有 .NET 類都是執行緒安全的。事實上,很少有人需要。一般來說,靜態成員應該是執行緒安全的,但僅此而已。

不可變/半不可變對像是自動執行緒安全的(這包括 XslTransform 等) - 在少數可變的情況下(例如執行緒容器),您可以期望事情是執行緒安全的。MSDN 聲明每個類的執行緒安全。

我不希望 cookie 容器是執行緒安全的,因此您可能必須自己同步它。

(更新)

再說你的第二點;您到底在考慮哪些變數?您自己的本地狀態變數不會在非同步請求期間直接更新,因此您只需在準備請求和處理響應時同步訪問即可。最常見的是,通過 a Monitor- ie

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();

引用自:https://stackoverflow.com/questions/396222