运行循环时不一致的异常

问题描述

最近,我创建了一个 Web 请求应用程序,用于根据给定的日期检索网站上的新闻文章。我创建了一个日期集合,即 [06-07-2021、06-08-2021、06-01-2021 等],并有一个 for 循环在该集合上运行并返回该日期的新闻文章。为了加快这个过程,我创建了一个运行在集合上的 Parallel.ForEach 循环,它将新闻文章存储在字典中,其中键是日期,值是文章。在 Parallel 循环中,当我尝试将键值对添加到字典中时,我收到一个 *system.invalidOperationException。它不会一直发生,所以我通常可以通过重新启动程序来解决问题。我收到的另一个异常是 **System.NullReferenceException,我认为这很奇怪,因为即使我的方法返回一个值,每个变量都被分配了一个值,尽管如果请求有问题,它会返回一个空字符串。此异常也可通过重新启动应用程序来解决

我的问题是为什么在运行这个应用程序时会出现异常不一致的情况?

*更改非并发集合的操作必须具有独占访问权限。对该集合执行并发更新并破坏了其状态。集合的状态不再正确。

**未将对象引用设置为对象的实例。

解决方法

当一个未明确记录为线程安全的类被多个线程并发访问时,其行为将变为未定义。这意味着“任何事情”都可能发生,提交抱怨不良行为的错误报告将是无效的,因为无论发生什么,类的制造商都不会将其视为错误。

“任何事情”不仅包括随机噪声异常,还包括静默数据损坏或丢失更新。

您可以深入研究 Dictionary<TKey,TValue> 类的 source code 并尝试了解特定异常的来源,但恕我直言,这将是徒劳的练习。您将获得的知识不太可能适用于任何现实生活场景。