Laden...

Generische Lösung für Threadsynchronisation

Erstellt von rollerfreak2 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.518 Views
rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren
Generische Lösung für Threadsynchronisation

Hallo zusammen,

ich suche derzeit nach einer schönen generischen Lösung für folgendes Problem. In einer klasse gibt es eine Methode die etwas berechnen soll. Diese greift Ihrerseits wieder auf andere Methoden andere Klassen/Object zu, entweder über Properties oder über Methoden.
Nun gibt es zwei möglichkeiten diese "Brechnungsmethode" aufzurufen. Einmal direkt, und einmal in einem separaten Thread. (Warum das so ist sei mal dahin gestellt!)

Nun müssen alle aufrufe die innerhalb der "Brechnungsmethode" aufgerufen werden synchronisiert werden, zumindets diejenigen die andere Klassen aufrufen (wenn die "Brechnungsmethode" in einem separaten Thread läuft). Nun hab ich keine Lust für alle diese aufrufe ein delegate zu definieren, und jedesmal zu schauen ob Invoke required ist.

Kennt jemand diesen UseCase bzw. hat einer eine Idee wie man sowas generisch lösen kann?

Ich hoffe ich konnte das Problem verständlich erläutern.

Again what learned...

2.298 Beiträge seit 2010
vor 13 Jahren

Könntest du die Berechnung nicht einfach immer im Thread ausführen lassen und den Thread mit Monitor.Wait und Monitor.Pulse von außen / innen kontrollieren?

Das heißt -> Berechnung ausgeführt - Thread wird angehalten. - Berechnung soll neu ausgeführt werden -> Pulse wird ausgeführt der Thread arbeitet weiter.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

wenn du eine wirklich generische Lösung für Synchronisation finden würdest, wäre dir wohl der Turing-Award sicher. Oder anders gesagt, Synchronisation ist ein schwieriges Geschäft, bei dem es immer auf den Einzelfall ankommt. Die Aufrufe von Methoden und Properties anderer Klassen (einzeln) zu synchronisieren, ist in vielen Fällen nicht ausreichend.

Davon abgesehen hat InvokeRequired in der Berechungsmethode einer (Modell)-Klasse auf keinen Fall etwas zu suchen. InvokeRequired ist eine Methode aus System.Windows.Forms und daher ausschließlich dem GUI-Code vorbehalten.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Hallo herbivore,

Davon abgesehen hat InvokeRequired in der Berechungsmethode einer (Modell)-Klasse auf keinen Fall etwas zu suchen.

Das ist ein eigener ThreadSynchronizer. Der hat nix mehr der GUI zu tun, sondern mit der eigenen Persitenz. Mit generisch meine ich eigentlich nur das Invoken aller _verschiedener _ MethodenSiganturen/Properties ohne für jede ein eigenes Delgate anzlegen.

Könntest du die Berechnung nicht einfach immer im Thread ausführen lassen

Nein das kann ich nicht, wie ich bereits geschrieben habe

(Warum das so ist sei mal dahin gestellt!)

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

Das ist ein eigener ThreadSynchronizer. Der hat nix mehr der GUI zu tun,

eben dann sollte er InvokeRequiered nicht benutzen.

Mit generisch meine ich eigentlich nur das Invoken aller verschiedener MethodenSiganturen/Properties ohne für jede ein eigenes Delgate anzlegen.

Du braucht keine extra Delegaten, wenn du den Action<>-Delegat verwendest.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Der Action delegate ist der schon seit .NET 2.0 drin? Weil ich bin leider auf diese Version angewiesen!

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

nein, ist er nicht, aber die sind ja einfach selbst zu definieren. Dann brauchst du für jede Anzahl von Parametern nur eine Delegaten-Definition. Wenn wir mal davon ausgehen, dass keine Methode mehr als fünf Parameter hat, kommst du mit sechs Delegaten-Definitionen aus.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Ich steh grad bisschen auf den Schlauch. Meinst du soll dann das delegate so definieren?


object ExampleDelegate(object param1, object param2);

Desweiteren müsste ich für Properties ersteinmal eine extra Methode anlegen, die dann via delegate invoked werden kann. Oder kann ich Properties auch per delegate invoken, hab dazu bis jetzt noch nichts gefunden.

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

nein, ich meine generisch. Schau in einfach die :rtfm: Doku für eine Version höher als 2.0.

herbivore

rollerfreak2 Themenstarter:in
916 Beiträge seit 2008
vor 13 Jahren

Wie gesagt

Weil ich bin leider auf diese Version angewiesen!

Again what learned...

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rollerfreak2,

ja, weiß ich. Sonst würden wir nicht darüber reden, dass du die Action-Delegaten selbst definierst. Aber wie sie definiert sind, steht nun mal erst in der Doku höher 2.0. Deshalb musst du dort nachschauen (die Doku gibt es ja online, also ist das kein Problem), wenn du wissen willst, wie man sie definiert sind / werden müssen. Und damit sollten wir das Thema endlich abschließen.

herbivore