How to get moment-in-time snapshot of ConcurrentDictionary?
c#, concurrentdictionary, multithreading
Solution
Just call `ToArray()` method.
Here is a source code:
/// <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);
}
}
Problem
MSDN states that the enumerator returned from the `ConcurrentDictionary` does not represent a moment-in-time snapshot of `ConcurrentDictionary`. Although it will be rarely needed in multi-threaded environment, but if one wants, what is the best way to get the moment-in-time snapshot of `ConcurrentDictionary`?