Frage

Ich bin auf der Suche nach einem Weg, um eine gleichzeitige Erhebung in C# oder zumindest eine Kollektion, die unterstützt eine gleichzeitige enumerator.Im Moment bin ich immer eine InvalidOperationException, wenn die Sammlung über die ich Durchlaufen Veränderungen.Ich konnte nur tief kopieren Sie die Sammlung und die Arbeit mit einem privaten kopieren, aber ich Frage mich, ob es vielleicht einen besseren Weg

Code-snippet:

foreach (String s in (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings))
    {
        //do some jazz
    }

--Bearbeiten--

Ich nahm mir die Antwort aber auch festgestellt, dass ich brauchte, um sicherzustellen, dass der code, der geschrieben hatte, die Sammlung musste Versuch, eine Sperre als gut.

    private void addKillString(String s)
    {
        lock (killStrings)
        {
            killStrings.Add(s);
        }
    }
War es hilfreich?

Lösung

Anderes als eine deep-copy, Ihre beste Wette könnte sein, sperren Sie die Sammlung:

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }

Andere Tipps

Also ich bin mir nicht ganz sicher, was Sie Fragen, aber die Parallel Extensions-team zusammengestellt, das einige Sachen könnten die Rechnung passen.Finden Sie in diesem blog-post insbesondere über Aufzählung parallele Sammlungen.Es enthält auch einen link zum download der Parallel CTP, und natürlich können Sie auch Blättern Sie durch den rest des blog-posts, um eine Vorstellung von dem, was die CTP soll und wie die Programmierung-Modell funktioniert.

Wenn Sie verwenden möchten die FCL-Sammlungen, dann sperren die einzige Möglichkeit ist, zu unterstützen iteration / Modifikation von mehreren threads, die sich überschneiden können.

Seien Sie vorsichtig, was Sie als Ihr Objekt sperren, obwohl.Mit SyncRoot ist nur eine gute Idee, wenn die Sammlung selbst ist ein privates Mitglied der Klasse, in der es verwendet wird.Wenn die Sammlung ist geschützt oder der öffentlichkeit, dann ein client der Klasse kann seine eigene Sperre auf Ihrem SyncRoot, potenziell zu Deadlocks mit code in Ihrer Klasse.

Wenn Sie daran interessiert sind, nehmen Sie einen Blick auf eine 3rd-party-Sammlung-Bibliothek, empfehle ich die ausgezeichnete C5 Generic Collection Library.Sie haben eine Familie von Baum-basierten Sammlungen, einfach und sicher geändert werden und bekräftigte zugleich, ohne Verriegelung - siehe Abschnitt 8.10 und 9.11 Ihrer (excellent) - Dokumentation für details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top