我有一個Web服務,我需要抓住一堆記錄並對每個記錄進行一些處理。這種處理可能每行都很冗長,我以線程方式運行這部分代碼,將行數據作爲參數傳遞給函數。我可以有1000或更多的行來處理,並且我將數據處理線程的數量限制爲10.如何產生線程並在Web服務中管理?
爲了監視我的線程,我有一個Thread對象數組。
Dim RowThread(9) As Thread
在我的主線程(Web服務的WebMethod)之前,我產生一個新的線程我遍歷這個數組,尋找我的下一個「可用」的線程。
Dim avail_thread As Integer = -1
While avail_thread < 0
For t As Integer = 0 To THREADCOUNT - 1
If IsNothing(RowThread(t)) OrElse Not RowThread(t).IsAlive Then
avail_thread = t
Exit For
End If
Next
End While
...
RowThread(avail_thread) = New Thread(New ParameterizedThreadStart(AddressOf ProcessRow))
...
RowThread(avail_thread).Start(row)
正如你所看到的,此等待線程完成,將產生的下一個可用線程的下一行。如果所有10個線程都在使用中,它將繼續循環並等待一個線程,因爲可用。
這種方法很好,在大多數服務器上運行良好。除了最近在某些服務器上,我注意到這會導致問題,因爲它在此循環中阻止了CPU。這會影響整體性能,因爲我的主線程正在浪費大量的CPU週期。爲了緩解這個問題,我嘗試了線程Sleep()甚至DoEvents(),但是這些方法只會進一步降低性能。
是否有其他人遇到過這種情況?我真的不認爲我可以使用委託等。因爲這是在一個Web服務中,我不希望我的主要調用被終止,因爲我不想在所有行都被處理之前發送結果。與ThreadPool相同的問題,更不用說ThreadPool的確給你儘可能多的控制。
如何負責任地產生並管理Web服務中的線程?有沒有辦法執行非阻塞手動線程監控?
您使用的是什麼版本的.NET?如果使用.NET 4.0,則應該嘗試使用Parallel.ForEach。 – 2012-02-08 19:29:33