C#并行循环问题

FAR*_*SAR 2 c# asp.net parallel-processing .net-4.0 linq-to-sql

当此代码运行显示我此错误:"对象引用未设置为对象的实例"错误发生在第一行=> MinorDBDataContext mdc = new...

而且对于"for(int i; i <1005; i ++){}"的序列也可以正常工作.

有什么问题 ?

Thread.CurrentThread.Priority = ThreadPriority.Highest;
        var query = from M in new MajorDBDataContext().User_Accounts select M;
        List<User_Account> Ulist = query.ToList();
        string d = DateTime.Now.ToString();
        int c = 0;
        string temp ="";
        Parallel.For(0, 1005, (i,loop) =>
        {
                try
                {
                    MinorDBDataContext mdc = new MinorDBDataContext(_Filings.OnServerRepository(Ulist[i].user_Sys_DBPath));
                    GoodJob(mdc, temp, i);
                    DA.Page page = mdc.Pages.Single();
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Email;
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Name;
                    temp += mdc.Minor_Users.Take(1).SingleOrDefault().Minor_User_Family + i.ToString();
                }
                catch { }
        });
        append(temp);
Run Code Online (Sandbox Code Playgroud)

Col*_*kay 5

您的例外情况可能表明其他事情.实际上是哪个值null?你不说.

我可以看到这段代码有些问题.

您不能依赖循环的顺序,而是temp +=在整个并行化代码中(顺序地将字符串添加到现有字符串,然后将字符串分配回原始变量).温度在并行循环外部设置.这非常危险.滥用共享状态/数据/资源是多线程代码中最常见的错误之一.

temp可能会不按顺序添加值.将同时向temp添加多个内容,因此temp可能最终丢失信息,因为temp正在从多个线程覆盖.

哪里_Filings来的?它是什么?

您可能希望temp string在循环内部创建一个新的并在其中添加所有内容,在每次迭代中将final添加tempConcurrentBag(在循环外部创建).然后,在并行循环之外,您可以迭代ConcurrentBag并在安全环境中构建最终字符串.

根据评论更新 评论:

在多线程循环中使用的System.Web.HttpContext.Current.Server.MapPath和HttpContext.Current为null.

原因是你现在与当前的HttpContext位于不同的线程,因此它无法回答任何问题.您必须将上下文传递给并行任务或其中的各个值.我不知道在并行环境中有多危险.

HttpContext myContext = HttpContext.Current;
Run Code Online (Sandbox Code Playgroud)

在你的并行循环中使用myContext而不是HttpContext.Current.

我不建议这样做,因为HttpContextin区域(如数据层)的知识设置了不必要的耦合并使应用程序很难维护.要推荐一个更好的解决方案,需要将您的应用程序分开,以便在论坛发布中更加可行.但是,目前它应该让你再次移动.