Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C并行循环问题_C#_Asp.net_Linq To Sql_.net 4.0_Parallel Processing - Fatal编程技术网

C# C并行循环问题

C# C并行循环问题,c#,asp.net,linq-to-sql,.net-4.0,parallel-processing,C#,Asp.net,Linq To Sql,.net 4.0,Parallel Processing,此代码运行时显示此错误:对象引用未设置为对象的实例 第一行中出现错误=>MinorDBDataContext mdc=new 但也与福林一系列;i

此代码运行时显示此错误:对象引用未设置为对象的实例 第一行中出现错误=>MinorDBDataContext mdc=new

但也与福林一系列;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);

您的例外情况可能表明其他事项。哪个值实际上为空?你没说

我可以看到这个代码有一些问题

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

temp的值可能是按顺序添加的。多个内容将同时添加到temp,因此temp可能会丢失信息,因为temp将被多个线程覆盖

这些文件来自哪里?这是什么

您可能希望在循环内创建一个新的临时字符串,并在其中添加所有内容,将最终临时添加到您在每次迭代中在循环外创建的ConcurrentBag中。之后,在并行循环之外,您可以迭代ConcurrentBag,并在安全环境中构建最终字符串

HttpContext myContext = HttpContext.Current;
根据评论更新 评论:

System.Web.HttpContext.Current.Server.MapPath 已使用且HttpContext.Current为空 在多线程循环中

原因是您现在与当前的HttpContext处于不同的线程上,因此它无法为您回答任何问题。您要么将上下文传递给并行任务,要么传递其中的单个值。我不知道在并行环境中这有多危险

HttpContext myContext = HttpContext.Current;
在并行循环中,使用myContext而不是HttpContext.Current


我不建议这样做,因为在诸如数据层之类的领域中对HttpContext的了解会建立不必要的耦合,并使应用程序很难维护。要推荐一个更好的解决方案,需要将你的应用程序分离开来,这在论坛帖子中是可行的。但是,目前它应该会让您再次移动。

为此,请考虑使用StringBuilder而不是String。使用StringBuilder可能无法解决多个线程同时添加到StringBuilder中,从而在StringBuilder中产生不一致状态或损坏字符串的问题。StringBuilder中的单个Append语句最多可能会按顺序应用。@科林:对不起,我没有试图提供问题的答案。我只是指出字符串concat不会对这里的性能产生奇迹。我应该说清楚的。谢谢。_fileings.OnServerRepository返回DataContext连接字符串的.mdf文件。该项目计划为每个用户1个数据库[多数据库设计]。在此函数中,使用System.Web.HttpContext.Current.Server.MapPath,并且HttpContext.Current在多线程循环中为空。谢谢你的帮助