【发布时间】:2014-07-08 20:52:02
【问题描述】:
这是我的代码:
Parallel.ForEach(Students, item =>
{
StudentModel studentModel = new StudentModel(item);
// Maybe he/she has alot of name
foreach (var words in studentModel.StudentNames.Split(','))
{
if (string.IsNullOrWhiteSpace(words))
return;
string tempWords = words.Trim();
// add it to student names list
STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault().student.Add(studentModel);
}
// add it to student list
STUDENT_MODELS.Add(studentModel);
});
我想做的是,我得到学生名单。将其转换为学生模型,获取学生姓名(因为一个学生有很多名字),然后我将姓名添加到姓名列表中,那是因为也许以后我需要获得同名学生并做一些事情..... 最后将学生添加到学生模型列表中。
问题发生在:
STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault().student.Add(studentModel);
这个地方总是发生:System.IndexOutOfRangeException
我已经将 Paralle.Foreach 更改为 Parallel.For ,并将 foreach 更改为 for,但没有任何改变。 我必须使用 Parallel,因为学生数大约 100000,如果我只使用 foreach 替换 Parallel.Foreach,则需要 160+ 秒,如果我锁定那个地方......仍然很慢......如果使用 Parallel。 Foreach,它将使用 20 秒左右,但我无法处理异常。
我已经尝试使用这个替换它:
StudentNames name = STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault();
if (null != name)
name.student.Add(StudentModel);
但问题仍然在某些时候发生............ 如果我只是尝试...抓住它并忽略它,那么当我稍后访问 STUDENT_NAMES 列表时,它仍然会抛出该异常............
我也尝试使用 ConcurrentBag ,但是速度很慢......我受不了......
请问有什么好的办法吗。非常感谢!
更新:
我不明白的是:为什么我不能在 Parallel.Foreach 的列表中添加一些东西。我认为 Parallel.Foreach 会使用很多线程,但事件使用多线程添加没有任何问题。
thread 1 add 和 thread 2 add 没有任何关系....为什么会发生那个异常?
【问题讨论】:
-
I also try use ConcurrentBag<> , but the speed very slow....I can't take it那就写个比ConcurrentBag更好的东西,可以同步访问。 -
不确定您要做什么,但必须有比 STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault() 更有效的方法。使用哈希集。