2014-01-31 27 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映射,请求和与请求相关的东西之间的关系更准确,因为它会在请求结束时销毁。正确? –

相关问题