c# - DataTable不适合这种线程操作吗?

标签 c# multithreading asynchronous datatable

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

我需要使其成为多线程,以便运行得更快,但我不确定 DataTable 是否适合于此。

我的流程是:

  1. 将 CSV 加载到数据表
  2. 调度程序函数将对任务进行排队,为每个任务分配一个数据表行号(我将限制并发任务的数量)
  3. 每个任务将仅读取其指定的数据表行。完成工作,然后相应地更新数据表行并完成。
  4. 在操作结束时或收到取消 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/

相关文章:

c# - EntityTypeBuilder<T> ASP.NET Core 2 Entity Framework 中的 OnDelete

c# - 超时正在触发,但应用程序继续正常运行

javascript - jquery ajax 成功回调中的 window.open 会阻止后续的 ajax 调用

javascript - Ionic Accordion 中断的切换功能。不展开第二个 Accordion 。(传递的数据太多?)

c# - 如何在Windows窗体中设置滚动条

c# - (MyClassName)object 与对象作为 MyClassName

python - 如何在 python 中高效地多线程或多进程处理大型 itertools.combinations?

multithreading - 使用 Hibernate SessionFactory 的多线程问题

javascript - 为什么 saga 函数第二次不接受请求?

c# - 绑定(bind)到 VirtualizingStackPanel 上的数据中断