微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

运行循环时不一致的异常

如何解决运行循环时不一致的异常

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

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

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

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

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。