gpt4 book ai didi

来自多个线程的 C# 数据表添加方法?

转载 作者:太空宇宙 更新时间:2023-11-03 21:55:24 25 4
gpt4 key购买 nike

我正在使用 .net 3.5 数据表并从多个线程向数据表添加行。当不使用锁时,datatablr 行数和最大索引不匹配。当尝试序列化表时,我得到一个异常 there is no rows at poitions X。当然我可以锁定数据表,但我想知道是什么原因。我希望 row.count() 方法基于行最大索引 +1 返回,而不是有一个非独立的计数器。另外,在哪里可以找到 rows.Add (params) 方法的内部实现?似乎每次添加时计数器都会增加,即使在某些情况下添加是在同一行。

编辑:感谢您的评论。我知道它不是线程安全的写入并且已经通过在 syncroot 对象上使用锁来解决它。我想看看 add 方法内部发生了什么,看看计数在哪里搞砸了。

最佳答案

原因很简单:DataTable 不是线程安全的。它没有声明是线程安全的(针对竞争写入),也不是要求是线程安全的。大多数代码不是线程安全的,除非明确说明“我在以下情况下是线程安全的”,否则您应该假定它不是。

最常见的是,在这种情况下,它意味着以下之一:

  • 索引更新丢失,即两者都在同时执行 count++,此时它仅增加 1
  • 当数组被复制、增长、收缩或重新排列时,操作会导致疯狂的数据

修复很简单:如果任何线程正在更改表,它必须具有独占访问权限。所以同步。 lock 是最简单的选项,但存在更多奇特的选项,例如 ReaderWriterLockSlim

那么下一步就是决定:我们真的想要使用DataTable吗?

关于来自多个线程的 C# 数据表添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com