[C#] - Methoden abschliessen

Passer

Erfahrenes Mitglied
Tagchen,

Folgendes Problem:
Ich habe eine Methode, die innerhalb eines Threading Gerüsts theoretisch durchaus mehrer Male gleichzeitig aufgerufen werden kann.
Das soll sie aber nicht.
Wenn die Methode ein zweites Mal aufgerufen wird, soll sie sofort wieder verlassen werden.
derzeit mache ich das mittels einer Boolschen Variablen, die während des Methodeneintritts auf true gesetzt wird

if (is_in_methodXY) return;

Wenn es sich aber um viele Methoden handelt, für die obiger Fall eintreten kann, wird es wegen der vielen extraVariablen schnell unübersichtlich.

Nun also meine frage:
gibt es in C# eine elegante Möglichkeit Methoden elegant und übersichtlich von einem Mehrfachzugriff auszuschliessen?

MfG
Christoph
 
Soweit ich das verstanden hab, wird beim lock solange gewartet, bis die Methode vom ersten Thread fertig ausgeführt wurde. Dann startet die Methode ein zweites usw mal.

Das wollte ich nicht.

Die Methode soll dann sofort verlassen werden.

Wenn ich mit locks arbeite, brauche ich soweit ich das verstanden habe auch immer Lockvariablen, damit hätte ich quasi das gleiche, nur in grün und trotzdem eine variable pro Methode zur Absicherung => nichts gewohnen.

Kann natürlich auch sein, dass ich das falsch verstanden habe, dann bitte ich um Aufklärung ;)

MfG
Christoph
 
Hallo!

Locks sind das C# Sprachmittel um:
Nun also meine frage:
gibt es in C# eine elegante Möglichkeit Methoden elegant und übersichtlich von einem Mehrfachzugriff auszuschliessen?
zu beantworten...

Beschreib doch einfach mal etwas genauer was du tun willst...

Gruß Tom
 
Ok, folgendes Szenario:
Thread1 führt Methode1 auf Grund eines aufgetretenden Zustands aus.
200ms
Thread2 führt Methode1 wegen des selben Zustands aus.

Methode1 braucht für die Ausführung 2 Sekunden. Es macht aber keinen Sinn diese nach Ihrer Beendigung noch einmal auszuführen, da der Zustands beseitigt wurde.

Ob der Zustand beseitigt wurde bzw. ob die Methode bereits ausgeführt wird könnte man nun anhand einer boolschen Variablen feststellen. So mache ich es zur Zeit.

Doch finde ich dieses Vorgehen "doof", da mit zunehmender Methodenzahl auch die Anzahl der Variablen steigt und die Quellcodeübersicht sinkt (Performancemässig macht es ja nichts aus).

Nun frage ich mich, ob es ähnlich des mir bekannten lock-Konstrukts eine Möglichkeit gibt, quasi am Anfang zu gucken, ob sich eine Methode in ausführung befindet.

Quasi so, wie mit lock, mur dass dann der zweite Aufrufer nicht wartet, sondern gleich die Methode verlässt.

Mit locks hätte ich ja quasi "nur" die Threadsynchronisation, also die Sicherheit, dass eine Methode nicht zweimal gleichzeitig ausgeführt wird. Ich will aber die Sicherheit, dass eine Methode nur einmal während des Auftreten eines Zustandes ausgeführt wird.

Ich hoffe, das ist so verständlich.

MfG
Christoph
 
Wenn Thread 2 nach 200ms die gleiche Methode aufruft, die Methode aber insgesamt 2 Sekunden benötigt, dann brauchst du ohnehin ein Lock, da du erst mit Ende des Durchlaufs festhalten kannst, dass die Methode fehlerfrei durchlaufen wurde.

Zum zweiten stellt sich mir die Frage ob das Grunddesign deiner Anwendung stimmt, wenn zwei unterschiedliche Threads für die gleiche Aufgabe zuständig sind. Grundsätzlich kann dies ja so gewünscht sein, aber wenn der zweite Aufruf nicht ausgeführt werden soll, dann ist es vermutlich besser die Zuständigkeiten entsprechend aufzuteilen.

Ohne genau Angaben was du machen willst und warum beide Threads die gleiche Methode ausführen (müssen) wird eine Beantwortung deiner Frage wohl eher ein Sonntag-Nachmittags-Rätsel.
 
Erzähl uns daher mal, was Du eigentlich machen willst.
Btw. Grundlegendes zu den Werkzeugen die für das Multi-Threading zur Verfügung hast,
findest Du hier: [thread=260455]Multi-Threading - Teil1: Einführung - Tutorial[/thread]
 
Wenn Thread 2 nach 200ms die gleiche Methode aufruft, die Methode aber insgesamt 2 Sekunden benötigt, dann brauchst du ohnehin ein Lock, da du erst mit Ende des Durchlaufs festhalten kannst, dass die Methode fehlerfrei durchlaufen wurde.
Das ist mir klar. Trotzdem bin ich dann immer noch nicht weiter, da mir locks ja wie gesagt nichts bringen (Stichwort zweiter durchlauf)
Deshalb habe ich auch auf die Spracheigenen locks verzichtet und locke manuell.

Zum zweiten stellt sich mir die Frage ob das Grunddesign deiner Anwendung stimmt, wenn zwei unterschiedliche Threads für die gleiche Aufgabe zuständig sind. Grundsätzlich kann dies ja so gewünscht sein, aber wenn der zweite Aufruf nicht ausgeführt werden soll, dann ist es vermutlich besser die Zuständigkeiten entsprechend aufzuteilen.
Im Grunde ist es so, dass Thread1 alle bspw 200 ms auf einen Zustand überprüft und dann eine Methode aufruft, wenn dieser Zustand auftritt.
Diese Methode läuft dann unabhängig vom Thread1 in einem anderen, bspw dem DisplayThread (sowas ist ja gängig).

Und um dann auch gleich ein Beispiel zu bringen, warum die Methode nicht zweimal auf einmal und auch nicht hintereinander ausgeführt werden darf:

Auf einmal: Weil bspw eine GUI oder COM Komponente verändert wird.
OK, da würden auch locks ausreichen.
ABER: locks reichen nicht aus, da die Methode auch kein zweites mal durchlaufen werden darf, weil sonst die Anwendung rumzickt.
Konkretes Beispiel:
Methode stoppe_DShowGraph()
{ mediacontrol.stop();}

Beim ersten Aufruf funktioniert alles, beim zweiten aufruf, also wenn der graph gestoppt ist oder beim stoppen ist, beendet sich die ganze Anwendung unsanft.
Abhilfe: Eine Variable isGraphRunning; Aber dann hätte ich zum Ursprungsproblem nichts gewonnen, dnen so mache ichs derzeit.
 
Erzähl uns daher mal, was Du eigentlich machen willst.
Btw. Grundlegendes zu den Werkzeugen die für das Multi-Threading zur Verfügung hast,
findest Du hier: [thread=260455]Multi-Threading - Teil1: Einführung - Tutorial[/thread]

Ok, folgendes Szenario:
Thread1 führt Methode1 auf Grund eines aufgetretenden Zustands aus.
200ms
Thread2 führt Methode1 wegen des selben Zustands aus.

Methode1 braucht für die Ausführung 2 Sekunden. Es macht aber keinen Sinn diese nach Ihrer Beendigung noch einmal auszuführen, da der Zustands beseitigt wurde.

Ob der Zustand beseitigt wurde bzw. ob die Methode bereits ausgeführt wird könnte man nun anhand einer boolschen Variablen feststellen. So mache ich es zur Zeit.

Doch finde ich dieses Vorgehen "doof", da mit zunehmender Methodenzahl auch die Anzahl der Variablen steigt und die Quellcodeübersicht sinkt (Performancemässig macht es ja nichts aus).

Nun frage ich mich, ob es ähnlich des mir bekannten lock-Konstrukts eine Möglichkeit gibt, quasi am Anfang zu gucken, ob sich eine Methode in ausführung befindet.

Quasi so, wie mit lock, mur dass dann der zweite Aufrufer nicht wartet, sondern gleich die Methode verlässt.

Mit locks hätte ich ja quasi "nur" die Threadsynchronisation, also die Sicherheit, dass eine Methode nicht zweimal gleichzeitig ausgeführt wird. Ich will aber die Sicherheit, dass eine Methode nur einmal während des Auftreten eines Zustandes ausgeführt wird.

Ich hoffe, das ist so verständlich.

Mit Multithreading kenne ich mich aus, aber nicht soweit, dass ich weiss, wie mein Problem zu lösen ist.

Zur Erinnerung:
Ich möchte eine Methode nur EINMAL gleichzeitig und auch nur EINMAL bis diese abgearbeitet ist (solange ein Zustand nicht bearbeitet wurde) aufgerufen haben. (Quasi so, wies oben in dem langen Text steht.
 
Was mir immer noch fehlt, machen beide Threads das gleiche? Wenn ja, warum zwei getrennte Threads?

Zweite Variante: Was ist, wenn du den zweiten Thread erst startest, wenn eben genau diese Methode komplett ausgeführt wurde? Der zweite Thread müsste dann diesen Methodenaufruf nicht mehr beinhalten und könnte dann seine Arbeit durchführen.
 

Neue Beiträge

Zurück