2015-02-05 74 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

相關問題