使用Parallel.ForEach for Regex.Matches的NullReferenceException

时间:2013-12-18 12:10:05

标签: c# parallel-processing

我有代码:

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)
         {
            ...
         }
      }
   } 
   ...
}

有时我在15行中有NullreferenceException。如果在插入“matchCollections”之前检查“matches”不为null,则抛出异常。有什么问题?

1 个答案:

答案 0 :(得分:4)

列表&lt; T&gt;不是线程安全的。这意味着如果从多个线程访问它,您将获得任何类型的随机错误,并且列表实例数据将被破坏。您可以在访问时锁定列表,也可以使用线程安全的集合:http://msdn.microsoft.com/en-us/library/dd997305%28v=vs.110%29.aspx

或者在你的情况下会更好,如果你可以从并行任务返回结果并让并行库收集结果,但我不确定它是那样的。这就是我发现的:http://msdn.microsoft.com/en-us/library/ff963547.aspx