阻止消费者进入阻止集合

时间:2015-06-13 02:40:18

标签: vb.net multithreading .net-4.5

我有一个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

1 个答案:

答案 0 :(得分:0)

这似乎是编写Parallel.ForEach(dt.Rows, dr => ProcessValue(dr))的一种复杂方式。

也许你需要限制并行度,因为Parallel.ForEach的启发式方法往往会产生疯狂的线程数。