c# - Parallel.ForEach 错误 HttpContext.Current

标签 c# asp.net-mvc linq entity-framework parallel-processing

此方法 - doDayBegin(item.BranchId) 需要很长时间才能执行。所以我使用 Parallel.ForEach 并行执行它。当我使用普通的 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)
{
    var httpContext = System.Web.HttpContext.Current;
    IDB0010020Repository _idDB0010020Repository = new DB0010020Repository();
    IDB0010044Repository _idDB0010044Repository = new DB0010044Repository();

     EBS.DAL.Model.DB0010020 branchDetails = _idDB0010020Repository.FindOne(d => d.BranchId == BranchId);
    if (branchDetails == null)
    {
        ModelState.AddModelError("", "Branch not found!");
    }
    else
    {
        try
        {
            DateTime LastOpenDate = DateTime.ParseExact(Request.Form["LastOpenDate"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
         //   branchDetails.LastOpenDate = LastOpenDate;
    //      branchDetails.LastOpenDate = Convert.ToDateTime(Request.Form["LastOpenDate"].ToString());


        }
        catch (Exception e)
        {
          //  branchDetails.LastOpenDate = Convert.ToDateTime("2014-07-25 00:00:00.000");
        }


        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;
    //added d
    DateTime DayDate = DateTime.ParseExact(Request.Form["LastOpenDate"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
    dayBegin.DayDate = DayDate;
    //added d

  //  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);
    }

}


这是错误 this error i am getting

会出现什么问题?为什么我的 session 为空。有什么办法可以解决

最佳答案

HttpContext.Current 是按线程设置的。因此,当您使用 Parallel.ForEach 启动更多线程时,您的新线程无法以这种方式访问​​它。解决方案是将所需的值作为参数一直传递,而不是依赖存储库中的 HttpContext.Current

SO 上有几个来源已经涵盖了这个问题。

The cross-thread usage of "HttpContext.Current" property and related things

HttpContext.Current.Items in different thread

Access HttpContext.Current from different threads

关于c# - Parallel.ForEach 错误 HttpContext.Current,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710980/

相关文章:

c# - 是否可以在多个母版页中调用一个网络表单?

c# - ASP.NET MVC 2.0 : Simple Model Binding not working/binding as it should

c# - 当我为所述类编写自己的包装器时,如何将 'hide' 内置于类中?

javascript - 如何在不提交表单的情况下通过按键盘上的 Enter 来获取文本值

jquery - 从 asp.net mvc 操作调用 jquery 函数

c# - Linq 中的短期约会

c# - visual C#2010播放形式1的声音(来自资源文件)

c# - 无法将 MVC 模型属性绑定(bind)到输入元素

c# - 将 IQueryable 转换为 IOrderedQueryable

c# - 为什么查询结果少了一个字符?