在Web應用程序中,會話僅在當前線程中可用。使用NHibernate在Web應用程序中進行異步查詢
有沒有人有任何提示在新的異步線程中通過NHibernate執行查詢?
例如,我怎麼能做出這樣的工作:
public void Page_Load()
{
ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar()));
}
在Web應用程序中,會話僅在當前線程中可用。使用NHibernate在Web應用程序中進行異步查詢
有沒有人有任何提示在新的異步線程中通過NHibernate執行查詢?
例如,我怎麼能做出這樣的工作:
public void Page_Load()
{
ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar()));
}
你需要有這對非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);
}
}
}
會話不是線程安全的。如果你在一個線程上創建一個會話並從另一個線程使用它,遲早會遇到問題。在後臺線程上創建一個新會話,並在後臺線程完成之前關閉它。
爲什麼它不工作? – Paco 2009-11-11 11:00:08
我有這個相同的問題。 NHibernate ISession存儲在HttpContext中,這在異步方法中不可用。有沒有解決的辦法? – 2009-11-11 15:58:05
如果你希望它的存活時間比HttpContext長,你爲什麼要在HttpContext中存儲會話? – Paco 2009-11-11 21:15:46