2015-06-13 49 views
1

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

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

也许,您需要限制并行度,以及因为Parallel.ForEach的启发式倾向于创建疯狂的线程数量。

+0

所以你说我不需要并发队列或阻塞集合? – user2382789

+0

你需要他们什么? – usr

相关问题