在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