Obtención de una excepción de argumento en un diccionario concurrente al ordenar y mostrar a medida que se actualiza

Recibo un error difícil de reproducir en el siguiente programa en el que varios subprocesos actualizan un diccionario concurrente en paralelo y el subproceso principal muestra el estado del diccionario ordenado después de intervalos de tiempo fijos, hasta que se completan todos los subprocesos de actualización.

public void Function(IEnumerable<ICharacterReader> characterReaders, IOutputter outputter)
{
    ConcurrentDictionary<string, int> wordFrequencies = new ConcurrentDictionary<string, int>();
    Thread t = new Thread(() => UpdateWordFrequencies(characterReaders, wordFrequencies));
    bool completed = false;
    var q = from pair in wordFrequencies orderby pair.Value descending, pair.Key select new Tuple<string, int>(pair.Key, pair.Value);
    t.Start();
    Thread.Sleep(0);

    while (!completed)
    {
        completed = t.Join(1);
        outputter.WriteBatch(q);
    }            
}

La función recibe una lista de flujos de caracteres y un resultado. La función mantiene un diccionario concurrente de frecuencias de palabras de palabras leídas de cada uno de los flujos de caracteres (en paralelo). Las palabras se leen en un nuevo hilo, y el hilo principal genera el estado actual del diccionario (en orden ordenado) cada 1 milisegundos hasta que se han leído todos los flujos de entrada (en la práctica, el resultado será algo así como cada 10 segundos, pero el error solo parece estar apareciendo para valores muy pequeños). La función WriteBatch solo escribe en la consola:

public void WriteBatch(IEnumerable<Tuple<string, int>> batch)
{
    foreach (var tuple in batch)
    {
        Console.WriteLine("{0} - {1}", tuple.Item1, tuple.Item2);
    }
    Console.WriteLine();
}

La mayoría de las ejecuciones están bien, pero a veces me sale el siguiente error en la instrucción foreach en la función WriteBatch:

"Excepción no controlada: System.ArgumentException: el índice es igual o mayor que la longitud de la matriz, o el número de elementos en el diccionario es mayor que el espacio disponible desde el índice hasta el final de la matriz de destino".

El error parece desaparecer si el subproceso principal se duerme por un corto tiempo después de iniciar los subprocesos de actualización y antes de iniciar el ciclo de visualización. También parece desaparecer si se elimina la cláusula orderby y el diccionario no se ordena en la consulta de linq. ¿Alguna explicación?

losforeach (var tuple in batch) La declaración en la función WriteBatch da el error. El seguimiento de la pila es el siguiente:

Excepción no controlada: System.ArgumentException: El índice es igual o mayor que la longitud de la matriz, o el número de elementos en el diccionario es mayor que el espacio disponible desde el índice hasta el final de la matriz de destino. at System.Collections.Concurrent.ConcurrentDictionary2.System.Collections.Ge neric.ICollection> .CopyTo (K eyValuePair2 [] array, índice Int32) en System.Linq.Buffer1..ctor (IEnumerable1 source) en System.Linq.OrderedEnumerable1. d__0.MoveNext () en System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext () en MyProject.ConsoleOutputter.WriteBatch (IEnumerable1 batch) en C: \ MyProject \ ConsoleOutputter.cs: línea 10 en MyProject.Function (IEnumerable), Cazon en un punto de vista de la casa de campo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta