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
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
...
...
Hallo Roki
beim zweiten Aufruf sollte doch InvokeRequired auf "false" sein, da es ja vom GUI-Thread aufgerufen wird?
Thomas
Hallo Roki,
der Code, den du gezeigt hast sieht richtig aus.
Probier mal trotzdem BeginInvoke statt Invoke.
herbivore
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