2 Stimmen

Tipps zum Einfädeln von Überlegungen + Design für folgende Fälle

Ich schreibe eine Klassenbibliothek, die einige asynchrone Verarbeitung bieten wird, und wollen versuchen und vermeiden, in Threading Probleme später auf der Linie laufen. Also ich bin nach alle Vorschläge, die Menschen machen können, um zu vermeiden, in Probleme später laufen, und stattdessen mit einem guten Design starten.

Ich sehe einige Situationen, die zu Problemen führen könnten, und bin mir nicht unbedingt sicher, wie sie am besten zu lösen sind:

1) Ich habe eine Klasse, die eine IEnumerable nimmt und eine ToList verwendet, um eine IList zu konstruieren. Die T's sind eine als öffentlich deklarierte Klasse innerhalb meiner Assembly. Beim Starten eines asynchronen Prozesses wird diese IList verwendet, um eine neue Auflistung zu erstellen. Zu diesem Zeitpunkt kann die aufrufende Assembly jedoch die ursprünglichen T's ändern, die zur Erzeugung meiner neuen internen Auflistung verwendet werden.

2) Ich habe eine boolesche Eigenschaft, von der ich erwarte, dass der Benutzer sie in einer Abfrageschleife verwendet. Ich bin ziemlich sicher, dass dies nicht ein Problem mit mir sein wird, die Eigenschaft in meiner Assembly zu setzen?

3) Ich habe regelmäßig eine interne Auflistung verwendet, die auf zwei getrennten Threads verwendet werden muss. Ich plane derzeit eine synchronisierte Sammlung zu verwenden und klonen Sie es, wenn ich eine Kopie benötigen... obwohl ich hoffe, dass dies nicht zu langsam sein wird.

4) In meiner asynchronen Methode möchte ich Ereignisse auslösen, wenn der Fortschritt oder Status ändert. Muss ich etwas beachten, wenn Ereignisse von Verarbeitungsthreads ausgelöst werden? Wieder mit einigen von diesen muss ich eine Variable übergeben, die als ein Klon von etwas intern innerhalb der Verarbeitung Threads verwendet werden, um zu versuchen und alle Probleme mit dem Benutzer ändern es zu vermeiden.

Vielen Dank im Voraus für jede Hilfe!

Ian

2voto

Jon Skeet Punkte 1325502

1) Versuchen Sie, Ihre Typen wenn möglich unveränderlich zu machen. Wenn das nicht möglich ist, müssen Sie an einem geeigneten Locking arbeiten.

2) Machen Sie die zugrunde liegende Variable volatile damit Aktualisierungen in allen Threads angezeigt werden

3) Wir bräuchten mehr Informationen, um einen vernünftigen Kommentar abgeben zu können.

4) Die Ereignisbehandler müssen wissen, dass sie in mehreren Threads aufgerufen werden können. Sie sollten sich auch eine vollständige Thread-sicheres Ereignismuster wenn Sie in der Lage sein müssen, Ereignisse aus verschiedenen Threads zu abonnieren und abzubestellen.

1voto

Marc Gravell Punkte 970173

2: Achten Sie auf volatile ( siehe hier zum Beispiel warum); und machen Sie keine "enge" Schleife. Signale (wie Monitor.Pulse oder ManualResetEvent usw.) werden oft bevorzugt.

4: Wenn dies für Anzeigezwecke ist, müssen Sie diese zurück zu dem UI-Thread marshal

0voto

Ian Punkte 32230

Danke, Leute,

1) Leider glaube ich nicht, dass es funktionieren würde, meine Typen unveränderlich zu machen, also muss ich sie vielleicht sperren. Glücklicherweise ist es nur während der anfänglichen Einrichtung der asynchronen Methode, wie ich vereinfachte interne Kopien der meisten Klasseninstanzen aus verschiedenen Gründen erstellen, an welchem Punkt ich nicht kümmern, was der Benutzer mit den Originalen tut.

2) Das flüchtige Schlüsselwort scheint etwas zu sein, das ich unbedingt brauche, also werde ich es einbauen.

3) Ich werde zwei Threads laufen lassen, die beide auf eine Collection< U> zugreifen müssen. Sobald sie diese Sammlung haben, werden sie sie ausgiebig nutzen und auch verschiedene Eigenschaften für jede U-Instanz ändern. Wenn sie fertig sind, speichern sie ein paar einfache Eigenschaften (z.B. Guid), werfen die Sammlung weg und müssen von vorne beginnen. Daher denke ich, dass eine ReadOnlyCollection< U> zunächst erstellt werden sollte, dann für jeden dieser Threads, wenn die Verarbeitung beginnt, werden sie eine Form einer Clone-Methode ausführen und die Ausgabe in eine neue IList< U> zum Beispiel, die sie tun werden, sie sind proessing auf.

4) Das ist nützlich, Jon, die Ereignisbehandlung kann von mehreren Threads aufgerufen werden, also werde ich sicherlich etwas in dieser Richtung verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X