Babybaer Geschrieben 15. Februar 2008 Geschrieben 15. Februar 2008 Hallo Leutz, ich habe eine Form, aus der Form erzeuge ich ein Obj dass auf eine Nachricht von einem Serivce per TCP warte. Jetzt habe ich mir eine Event geschrieben das ausgelöst werden soll, sobald eine Nachricht eintrifft. Soweit noch alles klar. Event wird auch ausgelöst... Aber dann bekommt ich diesen Fehler: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lbMessage erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde. Warum verstehe ich auch... Nur keine Ahnung wie ich das in den Griff bekomme. Eine Einfache Erklärung würde bestimmt schon helfen. Form Class private void StartClient() { rc = new RemotingClient.RemoteClient(); rc.event_IncomingMessage += new RemotingClient.IncomingMessageDelegate(this.OnIncomingMessage); rc.StartListen(); } public void OnIncomingMessage( string strMessage ) { //hier kommt der Fehler... lbMessage.Items.Add(strMessage); } [/PHP] Hier der Code aus dem RemoteClient [PHP] public delegate void IncomingMessageDelegate( string strMessage ); public class RemoteClient { public event IncomingMessageDelegate event_IncomingMessage; public RemoteClient() { } .... .... Remotable.StructResponse OnServerEvent(Remotable.StructAction structAction) { ... this.event_IncomingMessage(strMessage); ... } Zitieren
Argbeil Geschrieben 15. Februar 2008 Geschrieben 15. Februar 2008 Hi. Dein TCP Reader arbeitet asnychron, also in einem eigenen Thread. Wenn dieser Thread jetzt dein Main-Form manipulieren würde, könnte das unvorhersehbare Folgen haben da du nicht weißt in welchem Zustand sich das Form befindet, bzw. welche Threads im Moment auch noch Änderungen vornehmen. Deswegen darf nur der Thread auf Windows Forms Komponenten zugreifen, der auch der Eigentümer dieser Komponenten ist. Eine mögliche Lösung findest du auf meinem Blog: .NET 2.0 : Ansynchroner Datenbankzugriff mit .NET 2.0 Hier mache ich eine asynchronen Datenbankabfrage und gebe das Ergebnis zurück an das MainForm. Zitieren
Guybrush Threepwood Geschrieben 15. Februar 2008 Geschrieben 15. Februar 2008 Die Lösung lautet Invoke. protected void DisplayResult(string text) { if (m_Grid.InvokeRequired) { m_Grid.Invoke(new DisplayResultDelegate(DisplayResult), text); } else { m_Grid.Rows.Add(new Row(text)); } } [/PHP] Zitieren
Babybaer Geschrieben 15. Februar 2008 Autor Geschrieben 15. Februar 2008 Hammer danke danke :upps Zitieren
Babybaer Geschrieben 19. Februar 2008 Autor Geschrieben 19. Februar 2008 .NET 1.1 : Ansynchroner Aufruf? Vielleicht ist das ja dasselbe Problem? Habe in meiner Dlg-Class einen FileSystemWatcher laufen. Dieser wird auch ausgelöst und startet danach eine Funktion in der eine RAS Verbindung aufbaut und verschiedene Informationen an den Dialog übergibt. Über den Button 'Verbinden' löse ich dieselbe Aktion aus mit dem gewünschten Erfolg. Aber bei dem FileSystemWatcher Event bekomme ich nur sporadisch den gewünschten Effekt. Jemand eine Idee was das sein könnte? Zitieren
Argbeil Geschrieben 19. Februar 2008 Geschrieben 19. Februar 2008 Was ist denn der gewünschte Effekt? Löst der Watcher nicht aus oder was passiert? Zitieren
Babybaer Geschrieben 19. Februar 2008 Autor Geschrieben 19. Februar 2008 Doch der Watcher löst aus. Aber die Verbindung in der RAS kommt nicht immer zu stande. Die Verbindung wird irgendwie schon aufgebaut nur bekomme ich von der RAS Falsche Events und Infos zurück. Ist da ein Unterschied vorhanden??? ob ich jetzt auf dem Dlg den Button klicke und ein Event auslöse oder ob der FileWatcher die Aktion auslöst... Zitieren
Argbeil Geschrieben 19. Februar 2008 Geschrieben 19. Februar 2008 Ja, das ist schon ein Unterschied. Aber aus diesem Watcher-Event wird ja nur die RAS Verbindung aufgebaut und vermutlich nichts mit deiner GUI gemacht, oder? Man müsste den Code mal sehen. Zitieren
Babybaer Geschrieben 19. Februar 2008 Autor Geschrieben 19. Februar 2008 Ich sende an ein Label Text und Disable die Button... Das tut ja auch. Nur die Verbindung verhält sich anders Zitieren
Argbeil Geschrieben 19. Februar 2008 Geschrieben 19. Februar 2008 Die Verbindung sollte sich dann nicht anders verhalten. Es sein denn du initiierst die Verbindung durch einen Methodenaufruf eines Controls. Wie gesagt, man müsste den Code sehen. Zitieren
Babybaer Geschrieben 25. Februar 2008 Autor Geschrieben 25. Februar 2008 Also ich habe den Fehler gefunden. Ich hatte... wie auch immer 2 EventHandler laufen. Also habe ich gleich 2 mal dieselbe eine Nachricht erhalten, das dann die Ras etwas durcheinander gebracht hat... THX Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.