2013-12-18 3 views
0

У меня есть код:NullReferenceException использованием Parallel.ForEach для Regex.Matches

public void FindMatches(string source) 
{ 
    ... 
    var matchCollections = new List<MatchCollection>(); 
    Parallel.ForEach(patterns, 
     pattern => 
     { 
      var regex = new Regex(pattern); 
      MatchCollection matches = regex.Matches(source, 0); 
      matchCollections.Add(matches); 
     } 
    ); 
    foreach (MatchCollection matches in matchCollections) 
    { 
     if (matches.Count > 0) //NullReferenceException 
     { 
     foreach (Match match in matches) 
     { 
      ... 
     } 
     } 
    } 
    ... 
} 

Иногда я получил NullReferenceException в 15 строке. В случае проверки «совпадений» не имеет значения null до вставки в «matchCollections» - исключение все равно бросается. В чем проблема?

ответ

4

Список <T> не является потокобезопасным. Это означает, что при доступе к нему из нескольких потоков вы получите произвольные случайные ошибки, а данные экземпляра списка будут повреждены. Либо заблокируйте список при доступе к нему, либо вместо него используйте потокобезопасную коллекцию: http://msdn.microsoft.com/en-us/library/dd997305%28v=vs.110%29.aspx

Или было бы еще лучше в вашем случае, если бы вы могли вернуть результат из параллельной задачи и позволить параллельной библиотеке собирать результаты, но я не уверен, что он работает так. Это то, что я нашел: http://msdn.microsoft.com/en-us/library/ff963547.aspx

Смежные вопросы