使用 Parallel.ForEach 进行 Regex.Matches 时出现 NullReferenceException

问题描述 投票:0回答:1

我有代码:

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”不为空,则仍然会抛出异常。有什么问题吗?

c# parallel-processing
1个回答
5
投票

List<T>
不是线程安全的。这意味着如果您从多个线程访问它,您将收到任何类型的随机错误,并且列表实例数据将被损坏。访问列表时锁定列表,或者改用线程安全集合:线程安全集合

或者,如果您可以从并行任务返回结果并让并行库收集结果,那么在您的情况下会更好,但我不确定它是这样工作的。这是我发现的:并行聚合

© www.soinside.com 2019 - 2024. All rights reserved.