2009-03-19 2 views
2

Ich schreibe eine Klassenbibliothek, die einige asynchrone Verarbeitung bietet, und versuchen möchten, zu vermeiden, später in Threading-Probleme zu führen. Also bin ich hinter irgendwelchen Vorschlägen her, die Leute machen können, um später Probleme zu vermeiden, und stattdessen mit einem guten Design anfangen.Alle Tipps zu Threading-Überlegungen + Design für folgende Fälle

Einige der Situationen, die ich, dass Probleme verursachen könnten sehen können, und ich bin nicht neccessairly sicher, dass die beste Art und Weise zu lösen:

1) Ich habe eine Klasse, die eine IEnumerable und verwendet eine ToList nimmt eine IList zu konstruieren . Die T sind eine Klasse, die in meiner Versammlung als öffentlich deklariert ist. Nach dem Start eines asynchronen Prozesses wird diese IList zum Erstellen einer neuen Sammlung verwendet. An dieser Stelle ändert die aufrufende Assembly jedoch möglicherweise die ursprünglichen Ts, die zum Generieren meiner neuen internen Sammlung verwendet wurden.

2) Ich habe eine boolesche Eigenschaft, die der Benutzer in einer Abfrage-Schleife erwartet. Ich bin ziemlich sicher, dass dies kein Problem sein wird, wenn ich die Eigenschaft in meiner Assembly einstelle.

3) Ich habe regelmäßig eine interne Sammlung verwendet, die auf zwei separaten Threads verwendet werden muss. Ich plane derzeit, eine synchronisierte Sammlung zu verwenden und sie zu klonen, wann immer ich eine Kopie brauche ... obwohl ich hoffe, dass das nicht zu langsam wird.

4) Während meiner asynchronen Methode möchte ich Ereignisse auslösen, wenn sich der Fortschritt oder Status ändert. Muss ich etwas beachten, wenn Ereignisse von der Verarbeitung von Threads ausgelöst werden? Wiederum mit einigen von diesen muss ich eine Variable übergeben, die als ein Klon von etwas genommen wird, das intern in den Verarbeitungsthreads verwendet wird, um zu versuchen, Probleme mit dem Benutzer zu vermeiden, der es ändert.

Vielen Dank im Voraus für jede Hilfe!

Ian

Antwort

2

1) Versuchen Sie, Ihre Arten unveränderlich, wenn möglich zu machen. Wenn das nicht möglich ist, müssen Sie an einer geeigneten Sperre arbeiten. Machen

2), um die zugrunde liegende Variable volatile so dass Aktualisierungen in allen Threads gesehen bekommen

3) Wir möchten mehr Informationen müssen in der Lage sein, um vernünftig zu kommentieren.

4) Die Ereignisbehandlungsroutinen müssen sich bewusst sein, dass sie für mehrere Threads aufgerufen werden können. Sie sollten sich auch eine vollständige thread-safe event pattern ansehen, wenn Sie in der Lage sein müssen, Ereignisse von verschiedenen Threads zu abonnieren und abzubestellen.

1

2: Achten Sie auf volatile (see here zum Beispiel warum); und mache keine "enge" Schleife. Signale (wie ein Monitor.Pulse oder ein Manual, usw.) sind oft

bevorzugt

4: wenn dies für die Anzeige ist, werden Sie diese zurück an den UI-Thread

0

Danke Jungs Marschall benötigen,

1) Leider glaube ich nicht, dass meine Typen unveränderlich funktionieren würden, also müsste ich sie vielleicht sperren. Zum Glück ist es nur während der anfänglichen Einrichtung der asynchronen Methode, da ich aus verschiedenen Gründen vereinfachte interne Kopien der meisten Klasseninstanzen erstelle, wobei es mir egal ist, was der Benutzer mit den Originalen macht.

2) Das flüchtige Schlüsselwort sieht aus wie etwas, das ich definitiv brauche, also werde ich das einfügen.

3) Ich werde zwei Threads ausgeführt haben, die beide auf eine Collection zugreifen müssen < U>. Sobald sie diese Sammlung haben, werden sie sie umfassend verwenden und auch verschiedene Eigenschaften für jede U-Instanz ändern. Sobald sie fertig sind, speichern sie ein paar einfache Eigenschaften (z. B. Guid), werfen die Sammlung weg und müssen erneut beginnen. Daher denke ich, dass zuerst eine ReadOnlyCollection < U> erstellt werden sollte, dann wird für jeden dieser Threads beim Start der Verarbeitung eine Form einer Clone-Methode ausgeführt und die Ausgabe in eine neue IList < U> for konvertiert Beispiel, auf das sie tun werden, auf dem sie arbeiten.

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

Verwandte Themen