我在使用TPL和自定义LimitedConcurrencyLevelTaskScheduler
时遇到了奇怪的行为。基本上,我有一个包含几行的输入文件。
必须读取,解析每一行并处理其数据。处理完毕后,我得到一个输出字符串,应该将其写回输出文件,并与输入文件放在同一位置。
目前我正在创建一个读取输入行的调度程序任务,创建一个计算任务(执行计算并将输出字符串写入缓冲区)传递字符串和每行的行号,创建一个转储的假脱机任务定期将缓冲区定位到文件,然后等待所有任务终止。
我正在使用LimitedConcurrencyLevelTaskScheduler
,因为我需要限制实际运行的线程数。
问题似乎是当我运行的线程非常少(1或2)时,任务按行号顺序(从初始行到最终行)进行调度,但是以相反的顺序执行(从最终到初始执行) )。这对我来说是一个问题,因为假脱机线程无法将缓冲区转储到最后(因为行必须以正确的顺序打印),因此用户在99%的进度之前无法看到任何输出。 / p>
我读了this article from MSDN和我
据悉,ThreadPool
有一个FIFO全局队列,但每个线程都有一个LIFO本地队列来执行任务。这可能意味着为了避免这种奇怪的行为,我不应该使用ThreadPool
并自己写一个?这样对吗?
有没有人有任何建议?
答案 0 :(得分:0)
是的,这是正确的。我建议你使用PLINQ处理文件中的行。 PLINQ可以保留顺序并使用精确的并行度。