2009-11-11 2 views
4

Dans une application Web, la session est uniquement disponible dans le thread en cours.Requêtes asynchrones dans une application Web, à l'aide de NHibernate

Quelqu'un a-t-il des conseils pour exécuter des requêtes via NHibernate dans un nouveau thread asynchrone?

Par exemple, comment pourrais-je faire quelque chose comme ce travail:

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

Pourquoi ça ne marche pas? – Paco

+0

J'ai le même problème. Le NHibernate ISession est stocké dans le HttpContext qui n'est pas disponible dans les méthodes asynchrones. Y a-t-il un moyen de contourner ceci? –

+0

Pourquoi stockez-vous la session dans HttpContext si vous voulez qu'elle vive plus longtemps que HttpContext? – Paco

Répondre

3

Vous devez avoir un contexte de session qui est assez intelligent pour le contexte non Web. Mais plus important encore, le nouveau thread devrait avoir sa propre session.

Vous pouvez utiliser quelque chose comme ce qui suit:

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

sessions ne sont pas thread-safe. IOW vous rencontrerez tôt ou tard des problèmes si vous créez une session sur un thread et l'utilisez depuis un autre. Créez une nouvelle session sur votre thread d'arrière-plan et fermez-la avant la fin de votre thread d'arrière-plan.

-1

Que diriez-vous:

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

Cela peut causer des fuites de mémoire/connetionpool – Paco

Questions connexes