【发布时间】:2014-12-29 18:39:40
【问题描述】:
此方法 - doDayBegin(item.BranchId) 需要很长时间才能执行。所以我使用 Parallel.ForEach 并行执行它。当我使用正常的 foreach 循环时,它工作正常,但是当我使用 Parallel.ForEach 时,它显示此错误
在创建模型时不能使用上下文 Parallel.ForEach
public ActionResult Edit([DataSourceRequest] DataSourceRequest request)
{
try
{
JavaScriptSerializer js = new JavaScriptSerializer();
List<DB0010020Vm> _listDB0010020Vm = new List<DB0010020Vm>();
string dataDB0010020vm = Request.Form["griddetailsvm"];
if (!string.IsNullOrEmpty(dataDB0010020vm))
{
_listDB0010020Vm = js.Deserialize<List<DB0010020Vm>>(dataDB0010020vm).
Where(d => d.IsValid == "YES").ToList();
}
DateTime start = DateTime.UtcNow;
Parallel.ForEach(_listDB0010020Vm, item =>
{
doDayBegin(item.BranchId);
});
DateTime end = DateTime.UtcNow;
TimeSpan duration = end - start;
return Json(new
{
success = true,
message = "Day Begin Process Completed Successfully!" + duration
});
}
catch (Exception e)
{
return Json(new
{
success = false,
message = e.Message
});
}
}
public void doDayBegin(int BranchId)
{
using (var dbThread = new NeoSampleDBEntities()) // new db connection
{
EBS.DAL.Model.DB0010020 branchDetails = _idDB0010020Repository.FindOne(d => d.BranchId == BranchId);
if (branchDetails == null)
{
ModelState.AddModelError("", "Branch not found!");
}
else
{
branchDetails.LastOpenDate = Convert.ToDateTime(Request.Form["LastOpenDate"]);
OperationStatus status = _idDB0010020Repository.UpdateAndSave(branchDetails);
if (status != null && !status.Status)
ModelState.AddModelError("Updation failed", status.ExceptionMessage);
}
EBS.DAL.Model.DB0010044 dayBegin = new DB0010044();
dayBegin.BankId = 1;
dayBegin.BranchId = BranchId;
dayBegin.DayBeginFlag = 1;
dayBegin.DayDate = Convert.ToDateTime(Request.Form["LastOpenDate"]);
dayBegin.DayEndFlag = 0;
dayBegin.DayEndStage = 1;
dayBegin.DayReopenFlag = 0;
OperationStatus status2 = _idDB0010044Repository.AddAndSave(dayBegin);
if (status2 != null && !status2.Status)
ModelState.AddModelError("Updation failed", status2.ExceptionMessage);
else
{
CreateInwardSessionsForBranch(BranchId);
CreateOutwardSessionsForBranch(BranchId);
}
}
}
这是错误
会有什么问题?
【问题讨论】:
-
doDayBegin 方法中的内容。
-
doDayBegin 方法添加到问题@RonaldEstacion
-
移动 var dbThread = new NeoSampleDBEntities();在类级别上,并且仅在并行操作完成后才将其处置。
-
@RonaldEstacion 我没有在任何地方使用这条线,我为了测试目的而添加了这条线。
-
我的意思是在方法之外创建一个字段,私有 NeoSampleDBEntities dbThread = new NeoSampleDBEntities();,现在在 doDayBegin 方法中使用它而不使用 using() 块。我猜并行执行是在 FindOne 中的另一个调用完成之前处理上下文。
标签: c# asp.net-mvc linq entity-framework parallel-processing