Argumentausnahme im gleichzeitigen Wörterbuch beim Sortieren und Anzeigen während der Aktualisierung

Es wird schwierig, einen Fehler in dem folgenden Programm zu reproduzieren, in dem mehrere Threads ein gleichzeitiges Wörterbuch parallel aktualisieren und der Haupt-Thread den Status des Wörterbuchs nach festgelegten Zeitintervallen in sortierter Reihenfolge anzeigt, bis alle Aktualisierungsthreads abgeschlossen sind.

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);
    }            
}

Die Funktion erhält eine Liste von Zeichenströmen und einen Outputter. Die Funktion verwaltet ein gleichzeitiges Wörterbuch der Worthäufigkeiten von Wörtern, die aus jedem der Zeichenströme (parallel) gelesen wurden. Die Wörter werden von einem neuen Thread eingelesen, und der Haupt-Thread gibt alle 1 Millisekunde den aktuellen Status des Wörterbuchs (in sortierter Reihenfolge) aus, bis alle Eingabeströme gelesen wurden (in der Praxis beträgt die Ausgabe etwa alle 10 Sekunden). aber der Fehler scheint nur bei sehr kleinen Werten aufzutreten). Die WriteBatch-Funktion schreibt nur in die Konsole:

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

Die meisten Ausführungen sind in Ordnung, aber manchmal wird bei der foreach-Anweisung in der WriteBatch-Funktion der folgende Fehler angezeigt:

"Unbehandelte Ausnahme: System.ArgumentException: Der Index ist gleich oder größer als die Länge des Arrays, oder die Anzahl der Elemente im Wörterbuch ist größer als der verfügbare Speicherplatz vom Index bis zum Ende des Zielarrays."

Der Fehler scheint zu verschwinden, wenn der Hauptthread nach dem Starten der Aktualisierungsthreads und vor dem Starten der Anzeigeschleife eine kurze Zeit lang inaktiv ist. Es scheint auch zu verschwinden, wenn die orderby-Klausel entfernt und das Wörterbuch nicht in der linq-Abfrage sortiert wird. Irgendwelche Erklärungen?

Dasforeach (var tuple in batch) Anweisung in der WriteBatch-Funktion gibt den Fehler. Der Stack-Trace sieht wie folgt aus:

Nicht behandelte Ausnahme: System.ArgumentException: Der Index ist gleich oder größer als die Länge des Arrays, oder die Anzahl der Elemente im Wörterbuch ist größer als der verfügbare Speicherplatz vom Index bis zum Ende des Zielarrays. at System.Collections.Concurrent.ConcurrentDictionary2.System.Collections.Ge neric.ICollection> .CopyTo (K eyValuePair2 [] -Array, Int32-Index) at System.Linq.Buffer1..ctor (IEnumerable1 source) at System.Linq.OrderedEnumerable1. d__0.MoveNext () bei System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext () bei MyProject.ConsoleOutputter.WriteBatch (IEnumerable1 batch) in C: \ MyProject \ ConsoleOutputter.cs: Zeile 10 bei MyProject.Function1Readnumerer

Antworten auf die Frage(2)

Ihre Antwort auf die Frage