2014-01-31 62 views
0

我有以下類:.Net是否在不同的請求中重複使用相同的線程?

public static class ThreadStaticContainer 
{ 
    [ThreadStatic] 
    private static Dictionary<string, string> _valueDictionary; 

    public static Dictionary<string, string> ValueDictionary 
    { 
     get { return _valueDictionary ?? (_valueDictionary = new Dictionary<string, string>()); } 
    } 
} 

,它被稱爲在我的MVC操作是這樣的:

public ActionResult About() 
{ 
    ThreadStaticContainer.ValueDictionary.Add("1","1"); 
    return View(); 
} 

而且每隔一段時間我得到異常:

的項目已經添加了相同的密鑰。

這令我感到驚訝,因爲我認爲每個請求都有一個新線程。但它的行爲好像有時候一個請求會重用一個線程。

發生了什麼事?

回答

2

線程很貴。

爲了避免創建太多的線程,ASP.Net處理來自ThreadPool的可重用線程上的請求。
因此,你不能使用[ThreadStatic]那樣的。

取而代之,您應該將商品存儲在HttpContext.Items中。

+0

因此,每個請求都會得到一個線程,但該線程可能不是「新」且乾淨。該線程將來自線程池,可能以前由請求使用。真的嗎? –

+1

@Ev .:正確。 (除了用「通常」替換「可以」) – SLaks

+0

我明白了。謝謝。如果我將數據存儲在HttpContext中,我將得到更準確的1-1映射,請求和與請求相關的東西之間的關係更準確,因爲它會在請求結束時銷燬。正確? –

相關問題