Laden...

[gelöst] Invoke / Programm hängt

Erstellt von thomas.at vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.543 Views
T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 17 Jahren
[gelöst] Invoke / Programm hängt

Hallo

ich habe (bei einer Client/Server Anwendung mit Remoting) folgenden Code:



    private delegate void InsertListBoxDelegate(string s);
    private void InsertListBox(string s)
    {
      if (this.InvokeRequired)
      {
        this.Invoke(new InsertListBoxDelegate(InsertListBox), new Object[] { s });
      }
      else
      {
        lstMessages.Items.Add(s);
      }
    }

    // wird aus Remotingsystem aufgerufen (= anderer Thread)
    private void cb_OnCallbackReceived(object sender, SubmitEventsArgs e)
		{
      string s = string.Format("{0} sagt: {1}", e.Sender, e.Message);
      MessageBox.Show(s);
      InsertListBox(s);
		}


Das System empfängt die Botschaft (Messagebox im Event), geht dann in die Delegatemethode und hängt sich dann bein "this.Invoke" auf. Der Debugger lässt sich nur mehr mit "Stop" abbrechen, es kommt keine Fehlermeldung o.ä. Ich habe schon die diversen Beiträge (z.B. von herbivore in der FAQ) gelesen und wenn ich alles richtig verstanden habe, sollte der obige Code doch richtig sein?
Ich hoffe Ihr könnt mir auf die Sprünge helfen, wo der Fehler liegt, da ich bis jetzt noch nichts mit Threads zu tun hatte.

vielen Dank im vorraus
Thomas

R
21 Beiträge seit 2006
vor 17 Jahren

ich habe irgendwie das gefühl du rufst, wenn ein Invoke nötig ist, die Prozedur "InsertListBox" immer wieder auf.. -> endlosschleife

rufts InsertListBox auf
-> braucht invoke
--> InsertListBox
--> braucht invoke
--> InsertListBox
--> braucht invoke
--> InsertListBox
--> braucht invoke
...
...

T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 17 Jahren

Hallo Roki

beim zweiten Aufruf sollte doch InvokeRequired auf "false" sein, da es ja vom GUI-Thread aufgerufen wird?

Thomas

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Roki,

der Code, den du gezeigt hast sieht richtig aus.

Probier mal trotzdem BeginInvoke statt Invoke.

herbivore

T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 17 Jahren

Hallo herbivore

genau so funktioniert es, vielen Dank

Thomas

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo thomas.at,

naja, dass es funktioniert, hatte ich erwartet. 🙂 Ob BeginInvoke die Lösung ist, hängt aber von den näheren Umständen ab. Mit Invoke hattest du in deinem Programm ein Deadlock, den du mit BeginInvoke umgangen hast. Ob jetzt alles richtig läuft, hängt davon ab, warum der Deadlock überhaupt entstanden ist. Da solltest du vielleicht noch ein bisschen forschen.

herbivore