【发布时间】:2013-04-19 01:44:27
【问题描述】:
我有一个进程,我的主线程正在读取文件并将其拆分为多个部分。然后这些部分需要进一步处理。我想利用任何可用的线程,以便下游处理使用尽可能多的 CPU(或尽可能多的内核)。我不想从主线程创建过多的积压,所以我需要主线程等待添加到队列中,直到有另一个可用线程。
我看到很多类似VB.NET 4.0: Looking to execute multiple threads, but wait until all threads are completed before resuming 的文章,但它们都在等待所有线程完成,而我只需要任何线程都可用
这是我可以使用Task Parallel Library 解决的问题,还是我应该手动创建线程并监控线程池?
Using Reader As New StreamReader(FileName)
Do
CurrentBlockSize = Reader.ReadBlock(CurrentBuffer, 0, BufferSize)
RunningBuffer &= New String(CurrentBuffer)
If RunningBuffer.Contains(RowDelimiter) Then
LineParts = RunningBuffer.Split(RowDelimiter)
For I As Integer = 0 To LineParts.Count - 1
If I < LineParts.Count - 1 Then
'Make synchronous call that blocks until'
'another thread is available to process the line'
AddLineToTheProcessingQueue(CurrentLine)
Else
RunningBuffer = LineParts(I)
End If
Next
End If
Loop While CurrentBlockSize = BufferSize
End Using
【问题讨论】:
-
这几乎肯定是白费力气,这种代码几乎总是受磁盘限制。一个简单的检查:重启你的机器并运行单线程版本。如果一个内核上的 CPU 负载不超过 50%,那么添加更多线程并不能使其更快。
-
@HansPassant,下游工作将涉及处理大量数据并将其通过 TCP/IP 发送到数据库,这可能会比磁盘读取速度慢。这就是我想要多线程的部分
-
然后拉,不要推数据。就像大多数程序读取文件一样。
标签: .net multithreading task-parallel-library tpl-dataflow