Entwickler-Ecke

C# - Die Sprache - Threadübergreifender Vorgang


inlove21 - Mo 28.01.08 17:00
Titel: Threadübergreifender Vorgang
Hallo!

Ich habe eben einige Assemblys in VB eingebunden und beim Aufruf einer Methode des Assemblies, die auf die Methode eines Interfaces in der VB-Klasse zugreift, ist folgender Fehler aufgetreten:

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
Steuerelement ProtokollBox erfolgte von einem anderen Thread als dem
Thread, für den es erstellt wurde.

Der Aufruf der Assembly Methode sieht so aus:

Quelltext
1:
Subsembly.FinTS.Online.FinScriptSyncContact.Execute(Me, m_aBanking, m_aContact)                    


Die Methode der Schnittstelle, die Probleme verursacht so:

Quelltext
1:
2:
3:
Public Sub TraceAppendLine(ByVal sText As String) Implements Subsembly.FinTS.Online.IFinDocket.TraceAppendLine
        ProtokollBox.AppendText(sText & vbCrLf)
End Sub


Hat jemand eine Idee, woran das liegen könnte?
Das Assembly wurde mit C# erstellt.

Gruß,
Frank


Christian S. - Mo 28.01.08 17:03

Hallo!

Auf Steuerelemente musst Du im Thread der GUI zugreifen. Schau Dir dazu mal die Doku zum Stichwort "Invoke" an. Solltest Du zum Beispiel in den Membern der Form-Klasse finden.

Grüße
Christian


inlove21 - Mo 28.01.08 17:16

Ich hab mir die Doku gerade durchgelesen, ist aber alles sehr abstrakt, hab ich nicht wirklich verstanden...

Das Problem ist wohl, dass ich aus meinem Formular eine Methode aufrufe, die ein C# Formular öffnet, das dann wiederum auf eine Methode meines VB-Formulars zugreifen will.
Könnte mir bitte jemand konkret sagen, an welcher Stelle ich da Invoke wie anwenden muss? Ich blick da grad net so ganz durch.

Der Quelltext oben steht im selben Formular. Der erst Teil ruft ein Formular auf, was in einem C# Assembly generiert wird. Dieses greift dann auf den zweiten Quelltext, der ebenfalls im VB-Formular steht, zu und dann knallts.


Christian S. - Mo 28.01.08 17:40

Also erst einmal: Dass die Sachen in verschiedenen Sprachen geschrieben wurde, hat nichts mit dem Problem zu tun. Du hast im Threadtitel schon richtig geschrieben: Das Problem ist der Zugriff aus einem anderen Thread heraus.

Invoke bekommt als Parameter einen Delegate, welcher dann im Thread der GUI ausgeführt wird, sodass der Zugriff also aus dem richtigen Thread erfolgt. In diesem Fall musst Du also den Zugriff auf ProtokollBox in eine Methode verpacken und diese als Delegate an Invoke übergeben.


inlove21 - Di 29.01.08 12:36

Das heißt, ich definiere mir eine Methode

Quelltext
1:
2:
3:
Public Sub TextAnhaengen(ByVal sText As String)
     ProtokollBox.AppendText(sText)
End Sub


Und wie funktioniert das dann mit dem Invoke und dem Delegate?
Kannst du mir mal bitte den konkreten Quelltext posten? Danke!


Christian S. - Di 29.01.08 13:42

Ich hab keine Ahnung, wie man Delegates in VB benutzt :nixweiss:

Aber ich bin eh der Meinung, dass ein bisschen Eigeninitiative Deinerseits angesagt wäre, so dürfte es im Netz vor Beispielen nur so wimmeln, denn die Benutzung von Invoke ist recht alltäglich.