2015-02-20 3 views
3

Существует параллельный словарь, который собирает информацию из разных источников и один раз в минуту должен обновляться и передавать собранные данные другому обработчику.Ожидает, что все потоки закончат запись в ConcurrentDictionary

var currentDictionarySnapshot = _currentDictionary; 
_currentDictionary = new ConcurrentDictionary<int, string>(); 
return new ReadOnlyDictionary<int, string>(currentDictionarySnapshot); 

Что мне нужно сделать currentDictionarySnapshot ждать для всех потоков, которые имеют ссылки на него, чтобы закончить запись и создать новую ReadOnlyDictionary только после того, как. Поддерживает ли он ConcurrentDictionary или как это можно сделать, если это не так?

+1

вы можете использовать 'Task.WhenAll (Task1, Task2, ...);' method – chouaib

+0

Мои методы письма не являются асинхронными, и даже если бы это было так, было бы беспорядочно отличать задачи первичного словаря и моментального снимка. – Sovent

ответ

-1

Ну, решение моей проблемы, которую я создал, - это создать класс с помощью ManualResetEventSlim и добавить к нему счетчик. Когда приходит время читать, я делаю снимок этого класса, как я делаю это с ConcurrentDictionary, и жду, когда счетчик станет 0.

+0

Как вы гарантируете, что дальнейшие авторы не появятся сразу после того, как счет упал до нуля? В любом случае это не ответ, поскольку он слишком расплывчатый. – usr

+0

Я делаю снимок и заменяю экземпляр этого класса на новый. Старый останется с его писателями и позволит им закончить. – Sovent

+0

Снимки при копировании не являются мгновенными. Вы получите словарь, который «смазан» со временем. В любом случае, это не отвечает на вопрос, как дождаться окончания записи. Несмотря на то, что вы OP, ваш ответ соответствует тем же стандартам, что и другие ответы. – usr

0

Концептуально вам, кажется, нужен ReaderWriterLockSlim. «Читатели» - это потоки, записывающие в словарь. «Писатель» - это нить, копирующая словарь.

Обратите внимание, что встроенные RWL не масштабируются. Они просто блокируют внутренние структуры данных для каждой операции. Это разрушает свойство масштабируемости ConcurrentDictionary, которое масштабируется с помощью блокировки.