我有代码:
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,则抛出异常。有什么问题?
答案 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