2

我在使用 TPL 和 custom 时有一种奇怪的行为LimitedConcurrencyLevelTaskScheduler。基本上,我有一个包含几行的输入文件。必须读取、解析每一行并处理其数据。处理后,我得到了一个输出字符串,该字符串应该写回到与输入文件相同的位置的输出文件中。目前我正在创建一个调度程序任务,它读取一行输入,创建一个计算任务(执行计算并将输出字符串写入缓冲区)传递字符串和每行的行号,创建一个转储的假脱机任务定期将缓冲区写入文件,然后等待所有任务终止。

我正在使用 a LimitedConcurrencyLevelTaskScheduler,因为我需要限制正在运行的线程的实际数量。

问题似乎是,当我运行的线程数量非常少(1或2)时,任务按行号顺序(从初始行到最后一行)安排,但以相反的顺序执行(从最终到初始)。这对我来说是个问题,因为假脱机线程直到最后才能转储缓冲区(因为必须以正确的顺序打印行),所以用户在 99% 的进度之前无法看到任何输出。

我从 MSDN阅读了这篇文章, 了解到 aThreadPool有 FIFO 全局队列,但是每个线程都有一个用于执行任务的 LIFO 本地队列。这可能意味着为了避免这种奇怪的行为,我不应该使用ThreadPooland 自己写一个?这样对吗?有人有什么建议吗?

4

1 回答 1

0

是的,这是正确的。我建议您使用 PLINQ 来处理文件中的行。PLINQ 可以保持顺序并使用精确程度的并行性。

于 2012-10-18T15:54:53.063 回答