【发布时间】:2018-03-15 01:28:57
【问题描述】:
我正在使用Parallel.ForEach 提取一堆压缩文件并将它们复制到另一台机器上的共享文件夹中,然后启动BULK INSERT 进程。这一切都很好,但我注意到,一旦出现一些大文件,就不会启动新任务。我认为这是因为某些文件比其他文件花费的时间更长,TPL 开始缩小,并停止创建新任务。我已将 MaxDegreeOfParallelism 设置为合理的数字 (8)。当我查看 CPU 活动时,我可以看到,大多数时候 SQL Server 机器低于 30%,当它位于单个 BULK INSERT 任务上时甚至更少。我认为它可以做更多的工作。我可以以某种方式强制 TPL 创建更多同时处理的任务吗?
【问题讨论】:
-
会不会是所有线程都在等待访问同一个驱动器?
-
访问文件和更新数据库本质上是 IO 绑定的,并行执行只会导致共享资源的争用。执行此类 ETL 有很多选择。
-
与使用并行处理相比,您可能会发现使用异步更好,这样线程就不会阻塞 IO 并且可以用于其他任务。
-
@pep 我已将每个任务的
Thread.CurrentThread.ManagedThreadId添加到我们的控制台输出中,它们都是独一无二的。 -
@UrbanEsc 如果您没有使用异步/等待模式,那么它可能不是异步的。异步的想法不是关于在单独的线程上运行的东西,而是关于在 IO 发生时线程没有被阻塞导致它们什么都不做而不是其他工作。
标签: c# .net task-parallel-library parallel.foreach