Veröffentlicht 15. Februar 200817 j 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); ... }
15. Februar 200817 j 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.
15. Februar 200817 j 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]
19. Februar 200817 j .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?
19. Februar 200817 j Was ist denn der gewünschte Effekt? Löst der Watcher nicht aus oder was passiert?
19. Februar 200817 j 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...
19. Februar 200817 j 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.
19. Februar 200817 j Ich sende an ein Label Text und Disable die Button... Das tut ja auch. Nur die Verbindung verhält sich anders
19. Februar 200817 j 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.
25. Februar 200817 j 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
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.