我有一个带标题的 CSV 文件。每行代表必须完成的涉及 HTTP 请求和处理数据的工作。
我需要使其成为多线程,以便运行得更快,但我不确定 DataTable 是否适合于此。
我的流程是:
- 将 CSV 加载到数据表
- 调度程序函数将对任务进行排队,为每个任务分配一个数据表行号(我将限制并发任务的数量)
- 每个任务将仅读取其指定的数据表行。完成工作,然后相应地更新数据表行并完成。
- 在操作结束时或收到取消 token 后,DataTable 将被序列化回 CSV 文件。
只有 1 个任务会访问单个行,但多个任务将同时访问其分配的行。
这可能会给我带来问题吗?
由于没有两个任务会访问相同的 DataTable 行,因此是否有必要在每次任务读取或写入其 DataTable 行之前锁定 DataTable?
最佳答案
请引用 DataTable
的文档类,其中指出:
Thread Safety
This type is safe for multithreaded read operations. You must synchronize any write operations.
所以当你进行更新时需要锁定。行读取和处理应该是安全的。
请注意,执行写入操作时读取是否安全尚不完全清楚。如果您想要安全而不是后悔,您可以使用 ReaderWriterLockSlim
.
鉴于您限制并发任务的数量,避免大量锁争用的一个好策略可能是为每个任务提供行号的(顺序)分区,并让它们对多个任务执行批量更新已处理的行数。
关于c# - DataTable不适合这种线程操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134938/