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)
您的例外情况可能表明其他事情.实际上是哪个值null?你不说.
我可以看到这段代码有些问题.
您不能依赖循环的顺序,而是temp +=在整个并行化代码中(顺序地将字符串添加到现有字符串,然后将字符串分配回原始变量).温度在并行循环外部设置.这非常危险.滥用共享状态/数据/资源是多线程代码中最常见的错误之一.
temp可能会不按顺序添加值.将同时向temp添加多个内容,因此temp可能最终丢失信息,因为temp正在从多个线程覆盖.
哪里_Filings来的?它是什么?
您可能希望temp string在循环内部创建一个新的并在其中添加所有内容,在每次迭代中将final添加temp到ConcurrentBag(在循环外部创建).然后,在并行循环之外,您可以迭代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区域(如数据层)的知识设置了不必要的耦合并使应用程序很难维护.要推荐一个更好的解决方案,需要将您的应用程序分开,以便在论坛发布中更加可行.但是,目前它应该让你再次移动.
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |