2011-05-07 35 views
2

我在ASP.NET HttpHandler中使用了一個ThreadLocal變量。我認爲它會導致每個請求一個新的變量。ASP.NET中的ThreadLocal等同於每個請求變量嗎?

我在我的應用程序中有一些奇怪的行爲。當一個ThreadLocal變量被創建並放置在ASP.NET頁面中時?

如果以後ASP.NET使用相同的線程進行其他請求,會發生什麼情況?它是否會導致新的ThreadLocal變量或先前創建的值(與其他請求一起使用)將被使用?

如果當線程實際部署ThreadLocal變量設置,然後我的假設失敗,ASP.NET(因爲線程回到游泳池和不按要求是唯一的)

回答

4

ASP.NET能夠而且將會重用線程請求之間 - 實際上,如果內存服務,它會爲每個請求使用來自正常.NET線程池的線程。您可能更適合使用會話狀態。

+0

我簡化了問題。實際上,應用程序只是從'HttpHandler'啓動的。後來,一些可重複使用的模塊(用於桌面應用程序)將在其部分生命週期中處理請求,所以不知道ASP.NET會話。 – Xaqron 2011-05-07 02:21:35

+0

那麼你已經達到了一個備用解決方案呢? – 2011-05-07 02:22:49

+0

如果'ThreadLocal'以我期望的方式工作,那麼可以爲asp.net和桌面應用程序共享相同的模塊,但我不確定。 – Xaqron 2011-05-07 02:26:01

0

試試這個:

public class WebRequestLocal<T> 
{ 
    private readonly Func<T> _getter; 
    private readonly object _id = new object(); 

    public WebRequestLocal(Func<T> getter) 
    { 
     _getter = getter; 
    } 


    public T Value 
    { 
     get 
     { 
      HttpContext httpContext = HttpContext.Current; 
      if(httpContext == null) 
       throw new Exception("HttpContext unavailable."); 

      if (httpContext.Items.Contains(_id)) 
       return (T)httpContext.Items[_id]; 


      return (T)(httpContext.Items[_id] = _getter()); 
     } 
    } 
}