Laden...

Invoke und lock

Erstellt von miketech vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.265 Views
M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren
Invoke und lock

Hi,

ich arbeite zur Zeit viel mit Threads und nutze dementsprechend auch häufig invoke.

Jetzt habe ich um eine Methode mal ein lock (this) gebaut, um die Methode zu synchronisieren. Auf einmal fliegt mir mein ganzes Programm um die Ohren 🙂 Es scheint nicht wirklich einen Deadlock zu geben, weil die Methode wird definitv nur einmal aufgerufen. Ein Problem scheint viel mehr beim Invoke aufzutreten. Hat jemand eine Idee, was hier Probleme machen kann? Gibt es mit lock und Invoke irgendwas zu beachten?

Oder macht lock (this) Probleme?

Bin etwas ratlos, weil es wie gesagt kein Deadlock ist, sondern er bei Invoke irgendwie hängt.

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

warum soll das kein Deadlock sein? Wenn Invoke hängt, ist es wohl einer. Ich denke, du hast das gleiche Problem wie in Start eines asynchronen Vorgangs in einem kritischen Abschnitt (ggf. etwas weiter unten).

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hi,

danke für den Tipp. Ich habe nun alle Invokes durch BeginInvoke ersetzt und nun funktioniert es. Aber ich verstehe absolut nicht, wieso das passiert. Die Methode wird definitiv nicht zweimal aufgerufen, habe das auch mit Breakpoints überprüft. Wenn dann muss irgendwo anders ein Lock liegen. Kann sowas sein? Ich führe ja immer lock (this) aus. Machen das andere Methoden vielleicht auch, ohne dass ich das mitbekomme?

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

Wenn dann muss irgendwo anders ein Lock liegen.

Es kommt nicht darauf an, wo das lock steht (also ob es dieselbe Methode ist, oder nicht), sondern welches Objekt gelockt wird.

Machen das andere Methoden vielleicht auch, ohne dass ich das mitbekomme?

Nein! Also vielleicht locken die irgendwas, aber ziemlich sicher nicht dein Objekt.

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hm, das ist echt merkwürdig. Denn ich habe definitiv nur ein lock, um eine Methode. Und die wird nur gestartet, wenn ich auf einen bestimmten Button klicke, ansonsten nicht. D.h. es kann eigentlich gar keinen zweiten Aufruf der gelockten Methode geben. Ich werde nochmal alles durchsuchen.

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

im Zweifel findet man das durch Trace-Meldungen heraus. Durch Trace-Meldungen bekommst du eine Vorstellung von dem Ablauf der Anwendung. Ein Debugger ist bei Mulitthreading-Anwendungen dafür nicht so gut geeignet.

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hm, kann ich sowas in Visual Studio automatisch anzeigen lassen? Oder mach ich das auf die gute alte Methode und lass mir irgendwelche Meldungen ausgeben? 🙂

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

Hm, kann ich sowas in Visual Studio automatisch anzeigen lassen?

Denke nicht.

Oder mach ich das auf die gute alte Methode und lass mir irgendwelche Meldungen ausgeben?

Das kann man beliebig weit treiben. Vom simplen Console.WriteLine über Debug.WriteLine und eigene Logging-Klassen bis zu log4net.

Ich benutze zur Ablaufverfolgung oft folgende Helfer (für die man natürlich auch Debug statt Console verwenden kann).


public static void SayHello ()
{
   Console.WriteLine ("==> "
                    + new StackFrame (1).GetMethod().DeclaringType.Name
                    + "."
                    + new StackFrame (1).GetMethod().Name);
}

public static void SayHello (Object objThis)
{
   Console.WriteLine ("==> "
                    + objThis.GetType ()
                    + "/"
                    + new StackFrame (1).GetMethod().DeclaringType.Name
                    + "."
                    + new StackFrame (1).GetMethod().Name);
}

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Ok, alles klar. Danke

Gruß

Mike