У меня есть ситуация, когда я запускаю некоторые задачи, каждая из которых занимает от нескольких секунд до минут. У меня также есть возможность добавления дополнительных данных, которые необходимо добавить в уже запущенный цикл Parallel. Можно ли обновить текущую коллекцию, которую использует 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
Есть ли лучший подход к тому, что я пытаюсь сделать здесь?