我有一個進程,其中我的主線程正在讀取文件並將其分解成多個部分。那些部分則需要進一步處理。我想利用任何可用的線程,以便下游處理儘可能多地利用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