2015-02-05 70 views
0

我有一种情况,我正在运行一些需要几秒钟到几分钟的任务。我也有可能增加更多的数据,需要添加到已经运行的并行循环中。是否有可能更新Parallel.For正在使用的当前集合,并让它继续迭代,直到没有更多的对象要检索为止? 这里是显示我的问题的一些示例代码:我可以更新Parallel.For正在使用的集合吗?

[Test] 
public void DoesParallelForGetNewEntriesInLoop() 
{ 
    ConcurrentDictionary<int, string> dict = new ConcurrentDictionary<int, string>(); 
    ConcurrentBag<string> bag = new ConcurrentBag<string>(); 
    int i = 0; 
    // write to dictionary every 10ms simulating new additions 
    Timer t = new Timer(callback => 
    { 
     dict.TryAdd(i++, "Value" + i); 
    }, dict, 0, 10); 
    // Add initial values 
    dict.TryAdd(i++, "Value" + i); 
    dict.TryAdd(i++, "Value" + i); 
    dict.TryAdd(i++, "Value" + i); 

    Parallel.For(0, dict.Count, (a, state) => 
    { 
     string val = string.Empty; 
     if (dict.TryGetValue(a, out val)) 
     { 
      bag.Add(val + Environment.NewLine); 
     } 
     if (i++ == 50) 
      state.Stop(); 
     Thread.Sleep(5000); 

    }); 
    foreach (var item in bag) 
    { 
     File.AppendAllText("parallelWrite.txt", item); 
    }    
} 

当我运行这个结果我得到的是简单的:

Value2 
Value1 
Value3 
Value4 

有没有做什么,我想在这里做一个更好的办法?

回答

2

如何在Parallel.ForEach

BlockingCollection<string> collection = new BlockingCollection<string>(); 

Parallel.ForEach(collection.GetConsumingEnumerable(), (x) => Console.WriteLine(x)); 

您可以添加的东西用BlockingCollection的Add()方法收集利用BlockingCollection并调用GetConsumingEnumerable()

从技术上讲,“双重锁定”正在进行,因为Parallel.ForEach在将枚举项从可枚举项处理到进程时锁定集合,并且BlockingCollection被构建为支持多个消费者,因此它也实现了锁定。如果这成为性能问题(很可能),那么您可以为BlockingCollection实现自己的分区器,因为Parallel.ForEach具有接受OrderablePartitioner和Partitioner的重载。有一篇非常好的文章,描述如何在这里:http://blogs.msdn.com/b/pfxteam/archive/2010/04/06/9990420.aspx

+0

这使得很多的意义,我会试试看,并将其标记为答案,如果它的工作:) – 2015-02-05 21:29:35

+0

我结束了使用一点点不同的方法,但这有助于得到我在正确的轨道上。 – 2015-03-06 18:18:14

0

在开始循环之前,Parallel.For中参数和参数的计算仅计算一次。 使用Parallel.ForEach迭代新项目。 我不确定你想要达到什么,但更好的方法可能是将新数据放入堆栈/队列中,并定期弹出数据并处理它。

+0

感谢有关Parallel.For的信息,Parallel.ForEach似乎更好一些,但似乎在所有50个条目被添加之前摆脱了循环(它永远不会达到state.Stop()) – 2015-02-05 20:11:44

相关问题