我有一个Windows服务,在一个计时器事件上将项添加到一个阻塞集合,然后为要处理的队列中的每个项创建一个线程。我使用CompleteAdding()
来确保队列不是空的但是我仍然不确定是否为前
1.如果此方法是线程安全的
2. GetConsumingEnumerable()
是否让消费者线程无限期地等待更多工作? (我希望线程在处理时退出
完成)
3.此解决方案是否适用于生产环境?
dt = GetValues()
If Not dt Is Nothing Then
Dim value As Integer
For Each dr As DataRow In dt.Rows
BlockingColl.Add(value)
Next
BlockingColl.CompleteAdding()
Try
'Create consumer threads
While BlockingColl.IsCompleted = False
For Each value As Integer In BlockingColl.GetConsumingEnumerable()
Task.Factory.StartNew(Sub()
If (value IsNot Nothing) Then
ProcessValue(value)
End If
End Sub)
Next
End While
Catch e As InvalidOperationException
throw ex
End Try
End if
答案 0 :(得分:0)
这似乎是编写Parallel.ForEach(dt.Rows, dr => ProcessValue(dr))
的一种复杂方式。
也许你需要限制并行度,因为Parallel.ForEach
的启发式方法往往会产生疯狂的线程数。