2009-11-11 89 views
4

在Web應用程序中,會話僅在當前線程中可用。使用NHibernate在Web應用程序中進行異步查詢

有沒有人有任何提示在新的異步線程中通過NHibernate執行查詢?

例如,我怎麼能做出這樣的工作:

public void Page_Load() 
{ 
    ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar())); 
} 
+0

爲什麼它不工作? – Paco 2009-11-11 11:00:08

+0

我有這個相同的問題。 NHibernate ISession存儲在HttpContext中,這在異步方法中不可用。有沒有解決的辦法? – 2009-11-11 15:58:05

+0

如果你希望它的存活時間比HttpContext長,你爲什麼要在HttpContext中存儲會話? – Paco 2009-11-11 21:15:46

回答

3

你需要有這對非Web上下文足夠聰明會話環境。但更重要的是,新線程應該擁有自己的會話。

您可以使用類似以下內容:

private ISession threadSession 
{ 
    get 
    { 
     if (HttpContext.Current != null) 
     { 
      return (ISession)HttpContext.Current.Items["THREAD_SESSION"]; 
     } 

     return (ISession)AppDomain.CurrentDomain 
      .GetData("THREAD_SESSION" + Thread.CurrentThread.ManagedThreadId); 
    } 
    set 
    { 
     if (HttpContext.Current != null) 
     { 
      HttpContext.Current.Items["THREAD_SESSION"] = value; 
     } 
     else 
     { 
      AppDomain.CurrentDomain.SetData("THREAD_SESSION" 
       +Thread.CurrentThread.ManagedThreadId, value); 
     } 
    } 
} 
1

會話不是線程安全的。如果你在一個線程上創建一個會話並從另一個線程使用它,遲早會遇到問題。在後臺線程上創建一個新會話,並在後臺線程完成之前關閉它。

-1

如何:

​​
+0

這可能導致內存/連接池泄漏 – Paco 2009-11-16 22:13:26

相關問題