Asp.net mvc Parallel.foreach在初始化对话管理器时出错

Asp.net mvc Parallel.foreach在初始化对话管理器时出错,asp.net-mvc,nhibernate,Asp.net Mvc,Nhibernate,我使用的是mvc2和NHibernate2.1.2 在我的控制器类中,我调用的foreachParty方法如下: OrganizationStructureService.ForEachParty<Department>(department, null, p => { p.AddParentWithoutRemovingExistentAccountability(domainDepartment, AccountabilityTypeDbId.Supervision

我使用的是mvc2和NHibernate2.1.2

在我的控制器类中,我调用的
foreachParty
方法如下:

OrganizationStructureService.ForEachParty<Department>(department, null, p =>
{
    p.AddParentWithoutRemovingExistentAccountability(domainDepartment, AccountabilityTypeDbId.SupervisionDepartmentOfDepartment);
}
    }, x => (!(x.AccountabilityType.Id == (int)AccountabilityTypeDbId.SupervisionDepartmentOfDepartment)));


static public void ForEachParty<T>(Party party, 
                                   PartyTypeDbId? partyType, 
                                   Action<Party> action, 
                                   Expression<Func<Accountability, bool>> expression = null)
                                   where T : Party
{
    IList<Party> chilrden = new List<Party>();
    IList<Accountability> acc = party.Children;

    if (party != null)
        action(party);

    if (partyType != null)
        acc = acc.Where(p => p.Child.PartyTypes.Any(c => c.Id == (int)partyType)).ToList();

    if (expression != null)
        acc = acc.AsQueryable().Where(expression).ToList();

    Parallel.ForEach(acc, p =>
    {
        if (partyType == null)
            ForEachParty<T>(p.Child, null, action);
        else
            ForEachParty<T>(p.Child, partyType, action);
    });
}
OrganizationStructureService.ForEachParty(部门,空,p=>
{
p、 在不取消现有责任的情况下添加家长(domainDepartment,AccountabilityTypeDbId.SupervisionDepartment);
}
},x=>(!(x.AccountabilityType.Id==(int)AccountabilityTypeDbId.SupervisionDepartmentOfDepartment));
静态公共无效ForEachParty(Party,
PartyTypeDbId?partyType,
行动行动,
表达式=空)
T:派对在哪里
{
IList chilrden=新列表();
IList acc=派对儿童;
如果(参与方!=null)
行动(一方);
if(partyType!=null)
acc=acc.Where(p=>p.Child.PartyTypes.Any(c=>c.Id==(int)partyType)).ToList();
if(表达式!=null)
acc=acc.AsQueryable()。其中(表达式).ToList();
Parallel.ForEach(acc,p=>
{
if(partyType==null)
前一方(p.Child,null,action);
其他的
前一方(p.Child、partyType、action);
});
}
但就在对
foreach.parallel
执行操作之后,我不知道为什么对话会结束,我明白了

当前对话尚未初始化或已关闭


NHiberante会话不是线程安全的,因此在不为每个线程创建新会话的情况下,您无法查询数据库并行。

这是否意味着在这种情况下我不能使用并行,或者我有另一个选项可以使用它?这意味着您可以在不使用会话时使用它,或者在循环内创建会话。