【问题标题】:Is DataTable unsuitable for this type of threaded operation?DataTable 不适合这种类型的线程操作吗?
【发布时间】:2015-05-09 01:12:32
【问题描述】:

我有一个带有标题的 CSV 文件。每行代表必须完成的涉及 HTTP 请求和处理数据的工作。

我需要使这个多线程,以便工作得更快,但我不确定 DataTable 是否适合这个。

我的流程是:

  1. 将 CSV 加载到 DataTable
  2. 调度程序函数将任务排队,为每个任务分配一个 DataTable 行号(我将限制并发任务的数量)
  3. 每个任务将只读取分配给它们的 DataTable 行。完成工作,然后相应地更新 DataTable 行并完成。
  4. 在操作结束或收到取消令牌时,DataTable 将被序列化回 CSV 文件。

只有 1 个任务会访问单个行,但多个任务将同时访问分配给它们的行。

这可能会给我带来问题吗?

由于没有两个任务会访问同一个 DataTable 行,是否有必要在 Task 每次读取或写入其 DataTable 行之前锁定 DataTable?

【问题讨论】:

  • 为什么你不能去异步读取 csv?您可以快速阅读以获取 csv 的长度,然后只需启动多个任务,阅读 csv - 执行他们的任务并完成。为什么需要一个只读数据表来存储与 csv 相同的信息?
  • 我不确定你的意思。 DataTable 不是只读的。每个任务都将读取它们分配的 DataTable 行,做一些事情然后更新 DataTable 中的那一行。然后,DataTable 在进程结束时被序列化回 CSV。
  • 好吧,你还没有完全解释清楚——我以为它只是保存了关于任务做什么的信息
  • 听起来您正在尝试将 CSV 用作数据库。你为什么要这样做而不是仅仅使用数据库?
  • 我以 CSV 文件的形式提供输入,并且必须更新此 CSV 文件。更新后的 CSV 文件是最终目标,也是我必须生成的格式。

标签: c# multithreading asynchronous datatable


【解决方案1】:

请参阅DataTable 类的文档,其中指出:

线程安全

这种类型对于多线程读取是安全的操作。您必须同步所有写入操作。

因此,您需要在进行更新时锁定。行读取和处理应该是安全的。

请注意,在执行写入操作时读取是否安全尚不完全清楚。如果您想要安全而不是抱歉,您可以使用ReaderWriterLockSlim

鉴于您正在限制并发任务的数量,避免大量锁争用的一个好策略可能是为每个任务提供行号的(顺序)分区,并让它们对数字执行批量更新处理的行数。

【讨论】:

  • 我不同意。即使在读取过程中,行的内部索引也会发生变化。 DataTable 是线程安全的,但 DataRow 不是,这使得 DataTable 线程安全无关紧要。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多