Asp.net mvc Parallel.foreach在初始化对话管理器时出错
我使用的是mvc2和NHibernate2.1.2 在我的控制器类中,我调用的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
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会话不是线程安全的,因此在不为每个线程创建新会话的情况下,您无法查询数据库并行。这是否意味着在这种情况下我不能使用并行,或者我有另一个选项可以使用它?这意味着您可以在不使用会话时使用它,或者在循环内创建会话。