C# C并行循环问题
此代码运行时显示此错误:对象引用未设置为对象的实例 第一行中出现错误=>MinorDBDataContext mdc=new 但也与福林一系列;i<1005;i++{}工作正常 有什么问题吗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
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在多线程循环中为空。谢谢你的帮助