MSDN указывает, что перечислитель, возвращенный из словаря, не представляет момент- моментальный снимок словаря. Хотя это редко требуется в многопоточной среде, но если нужно, как лучше всего получить моментальный снимок ConcurrentDictionary?
Как получить моментальный снимок ConcurrentDictionary в С#?
Ответы (1)
Просто вызовите метод ToArray()
.
Вот исходный код:
/// <summary>
/// Copies the key and value pairs stored in the <see cref="ConcurrentDictionary{TKey,TValue}"/> to a
/// new array.
/// </summary>
/// <returns>A new array containing a snapshot of key and value pairs copied from the <see
/// cref="ConcurrentDictionary{TKey,TValue}"/>.</returns>
[SuppressMessage("Microsoft.Concurrency", "CA8001", Justification = "ConcurrencyCop just doesn't know about these locks")]
public KeyValuePair<TKey, TValue>[] ToArray()
{
int locksAcquired = 0;
try
{
AcquireAllLocks(ref locksAcquired);
int count = 0;
checked
{
for (int i = 0; i < m_tables.m_locks.Length; i++)
{
count += m_tables.m_countPerLock[i];
}
}
KeyValuePair<TKey, TValue>[] array = new KeyValuePair<TKey, TValue>[count];
CopyToPairs(array, 0);
return array;
}
finally
{
ReleaseLocks(0, locksAcquired);
}
}
person
apocalypse
schedule
11.05.2017
Вы даже можете связать его с
foo.ToArray().ToDictionary(x=>x.Key, x=>x.Value);
, чтобы вернуть его в словарной форме. (Не делайте только foo.DoDictionary()
, иначе в качестве источника данных будет использоваться функция .GetEnumerator()
вместо функции .ToArray()
)
- person Scott Chamberlain; 11.05.2017
ConcurrentDictionary
этого не делает. - person xxbbcc   schedule 11.05.2017GetEnumerator()
дляConcurrentBag<T>
,ConcurrentQueue<T>
илиConcurrentStack<T>
, все они предоставляют моментальный снимок счетчика во времени. - person Scott Chamberlain   schedule 11.05.2017ToArray
? - person Ivan Stoev   schedule 11.05.2017BlockingCollection
, а затем вызвать для нее.GetConsumingEnumerable()
. Он предоставляет перечисляемое с оперативными данными и удаляет элементы из коллекции, поскольку элементы возвращаются в перечисляемое. - person Scott Chamberlain   schedule 11.05.2017