Hat mir jemand eine fertigen code in C#, denn ich ich möchte einen button.performClick threadsicher aufrufen! Danke Markus
Markus schrieb: > ich möchte einen button.performClick threadsicher aufrufen! und wo ist das Problem? http://msdn.microsoft.com/de-de/library/ms173179%28v=vs.80%29.aspx
Ist das dann die Lösung wenn diese Fehlermeldung kommt? Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Markus schrieb: > Ungültiger threadübergreifender Vorgang: Der Zugriff auf das > Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem > Thread, für den es erstellt wurde. nein, das ist ein anderes Problem dieses "Problem" wurde schon ausreichend gelöst einfach mal bei googel "Ungültiger threadübergreifender Vorgang" suchen. Dann wirst du dinge wie invoke finden.
ah ok kann ich etwas mehr Hilfe bekommen, für mein Problem mit diesem Fehler? Ungültiger threadübergreifender Vorgang: Der Zugriff auf das > Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem > Thread, für den es erstellt wurde.
1 | toolStripStatusLabel1.Text = i.ToString(); |
Das hier führt zu dem Fehler! Wie kann ich den jetzt beseitigen? Grüße
1 | private void Function() |
2 | {
|
3 | |
4 | System.Object lockThis = new System.Object(); |
5 | |
6 | lock (lockThis) |
7 | {
|
8 | toolStripStatusLabel6.Text = i.ToString(); |
9 | }
|
10 | }
|
So geht es aber nicht! Kann mir jemand sagen, wieso es so nicht geht?
Dein Lock verhindert ja nur, dass genau dieser Codeteil von einem anderen Thread ausgeführt wird. Andere asynchone Manipulationen am Objekt werden nicht verhindert. Die Änderung am Objekt muss vom Vordergrundthread geschehen. Und das erreicht man bequem mit Invoke.
Eine Möglichkeit wäre z.B.: [/code] // this. ist hierbei die Form oder ein anderes Objekt, das Invoke() unterstützt und im GUI-Thread erzeugt wurde. this.Invoke((MethodInvoker)delegate { // (X) Hierhin, den Code der im GUI-Thread ausgeführt werden soll }); [/code] Stark vereinfacht - Durch den Invoke wird: 1) der Code, der im GUI-Thread läuft an geeigneter Stelle unterbrochen 2) dann im GUI-Thread (X) ausgeführt 3) und dann läuft der normale Code im GUI-Thread weiter und ebenso der Thread, der Invoke aufgerufen hat.
Wenn du es Quick & Dirty magst, dann versuche mal das hier: Control.CheckForIllegalCrossThreadCalls = False Ist allerdings nicht ganz ungefährlich, weshalb ich den Weg über invoke bevorzugen würde. Aber mal für ein kleines schnelles Programm geht es...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.