非同步 HttpContext.Current實現取值的方法

iDotNetSpace發表於2009-07-16

在一個專案中,為了系統執行效率更快,把一個經常用到的資料庫表通過dataset放到Application中,發現在非同步實現中每一次都會出現HttpContext.Current為null的異常,後來在網上查了好多資料,發現問這個問題的人多,回答的少,回答的也多數都是:引用System.Web,不要用HttpContext.Current.Application應該用System.Web.HttpContext.Current.Application,後來在網上看到一篇關於System.Runtime.Remoting.Messaging.CallContext這個類的詳細介紹才知道,原來HttpContext.Current是基於System.Runtime.Remoting.Messaging.CallContext這個類,子執行緒和非同步執行緒都無法訪問到主執行緒在CallContext中儲存的資料。所以在非同步執行的過程會就會出現HttpContext.Current為null的情況,為了解決子執行緒能夠得到主執行緒的HttpContext.Current資料,需要在非同步前面就把HttpContext.Current用HttpContext的方式存起來,然後能過引數的形式傳遞進去,下面看看實現的方法:

public HttpContext context
{
    get { return HttpContext.Current; }
    set { value = context; }
}
然後建立一個委託
public delegate string delegategetResult(HttpContext context);

下面就是實現過程的編碼

protected void Page_Load(object sender, EventArgs e)
{
   context = HttpContext.Current;
   delegategetResult dgt = testAsync;
   IAsyncResult iar = dgt.BeginInvoke(context, null, null);
   string result = dgt.EndInvoke(iar);
   Response.Write(result);
}

public static string testAsync(HttpContext context)
{
    if (context.Application["boolTTS"] == null)
    {
        Hashtable ht = (Hashtable)context.Application["TTS"];
        if (ht == null)
        {
            ht = new Hashtable();
        }

        if (ht["A"] == null)
        {
            ht.Add("A", "A");
        }

        if (ht["B"] == null)
        {
            ht.Add("B", "B");
        }

        context.Application["TTS"] = ht;
   }

   Hashtable hts = new Hashtable();
   hts = (Hashtable)context.Application["TTS"];
   if (hts["A"] != null)
   {
      return "恭喜,中大獎呀";
   }
   else
   {
      return "我猜你快中獎了";
   }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章