DataTable是否不适合这种类型的线程操作?

时间:2015-05-09 01:12:32

标签: c# multithreading asynchronous datatable

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

我需要制作这个多线程,以便更快地运行,但我不确定DataTable是否适用于此。

我的流程将是:

  1. 将CSV加载到DataTable
  2. 调度程序函数将为任务排队,为每个任务分配一个DataTable行号(我将限制并发任务的数量)
  3. 每个任务只会读取其指定的DataTable行。然后,工作相应地更新DataTable行并完成。
  4. 在结束或操作或收到取消令牌时,DataTable将被序列化为CSV文件。
  5. 只有1个任务可以访问单个行,但多个任务将同时访问其分配的行。

    这可能会给我带来麻烦吗?

    由于没有两个任务会访问同一个DataTable行,所以甚至需要在每次Task读取或写入其DataTable行之前锁定DataTable吗?

1 个答案:

答案 0 :(得分:2)

请参阅DataTable类的文档,其中声明:

  

线程安全

     

对于多线程读取操作,此类型是安全的。您必须同步任何写入操作。

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

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

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