我有一个进程,其中我的主线程正在读取文件并将其分解成多个部分。那些部分则需要进一步处理。我想利用任何可用的线程,以便下游处理尽可能多地利用CPU(或更多的核心)。我不想从主线程创建过多积压,所以我需要主线程等待添加到队列中,直到有另一个可用线程。.NET - 阻塞主线程,直到有任何可用线程
我看到像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%,那么添加更多线程无法使其更快。 – 2013-04-25 18:47:56
@HansPassant,下游工作将涉及处理并通过TCP/IP向数据库发送大量数据,这可能会比磁盘读取速度慢。这就是我想要的多线程部分 – 2013-04-25 18:59:29
然后拉,不要推送数据。就像大多数程序读取文件一样。 – 2013-04-25 19:48:42