2009-11-11 53 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

相关问题