這是我的代碼:爲什麼我不能在Parallel.For或Parallel.Foreach上使用List.Add()?
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);
});
我想要做的是,給我的學生名單。將其轉換爲學生模型,獲取學生姓名(因爲一個學生有很多姓名),然後我將姓名添加到姓名列表中,這是因爲可能以後我需要同名學生並做一些事情..... finally add學生到學生模型列表。
問題發生在:
STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault().student.Add(studentModel);
這個地方總是在發生:System.IndexOutOfRangeException
我已經改變Paralle.Foreach到的Parallel.For,並更改的foreach爲,但沒有什麼變化。 我必須使用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列表時,它仍然拋出異常............
我也試用併發袋<>,但速度很慢....我可以別拿了.....
I請有任何好的方法來處理它。非常感謝你!
UPDATE:
什麼我不明白的是:爲什麼我不能添加一些東西在Parallel.Foreach列表。我認爲Parallel.Foreach將使用很多線程,但事件使用多線程添加對它沒有任何問題。
線程1添加和線程2添加沒有任何關係....爲什麼發生這種異常?
'我也嘗試使用ConcurrentBag <>,但速度很慢....我不能接受它'然後寫一些比* ConcurrentBag *更好的可以同步訪問的東西。 – EZI
不確定你要綁定什麼,但必須要比STUDENT_NAMES.Where(x => x.SearchWords == tempWords).FirstOrDefault()更有效。使用哈希集。 – Paparazzi