使用NHibernate在web应用程序中进行异步查询

使用NHibernate在web应用程序中进行异步查询,nhibernate,asynchronous,Nhibernate,Asynchronous,在web应用程序中,会话仅在当前线程中可用 有没有人知道在新的异步线程中通过NHibernate执行查询的技巧 例如,我如何才能使这样的工作: public void Page_Load() { ThreadPool.QueueUserWorkItem(state => FooBarRepository.Save(new FooBar())); } 会话不是线程安全的。如果您在一个线程上创建会话并从另一个线程使用它,那么您迟早会遇到问题。在后台线程上创建一个新会话,并在后台线程完

在web应用程序中,会话仅在当前线程中可用

有没有人知道在新的异步线程中通过NHibernate执行查询的技巧

例如,我如何才能使这样的工作:

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

会话不是线程安全的。如果您在一个线程上创建会话并从另一个线程使用它,那么您迟早会遇到问题。在后台线程上创建一个新会话,并在后台线程完成之前将其关闭。

如何:

public void Page_Load()
{
    ThreadPool.QueueUserWorkItem(state => NHibernateSessionFactory.GetSession().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);
        }
    }
}

我也有同样的问题。NHibernate ISession存储在HttpContext中,而HttpContext在异步方法中不可用。有办法解决这个问题吗?如果希望会话比HttpContext寿命更长,为什么要将会话存储在HttpContext中?因为这是web应用程序中的标准做法,这可能会导致内存/连接池泄漏