Mahlzeit ihr lieben!
Problem: Ich sende per RaiseEvent ein Event aus meiner Klasse an meine Form und erhalte folgenden Fehler:
Ursache: Innerhalb meiner Klasse arbeite ich mit einem websocket und entsprechenden Handlern:
Hier wird das Event ausgelößt..
Und hier kommt es zur Ausnahme:
Mein Lösungsansatz:
Da ich hier tatsächlich Threatübergreifend arbeite, dachte ich mir, dass ich einen Forms.Timer in meine Klasse einbaue und die Events nicht direkt aus den Websocket-Handlern aufrufe, sondern in einer List zwischenspeichere und dann über das Tick-Ereignis des Timers auslöse.
Wenn ich aber eine List(of String) für den Event-Namen und eine List(of Args) für die Event-Argumente erstelle, wie löse ich dann im Tick-Ereignis des Timers das Event aus?
Vielleicht wisst ihr ja eine Lösung oder einen anderen Weg, wie ich möglichst Realtime meine Events an die Form gesendet bekomme und dort auf Steuerelemente zugreifen kann, obwohl ich mich in einem anderen Thread befinde.
Danke schonmal und Lg Hassowuff
Problem: Ich sende per RaiseEvent ein Event aus meiner Klasse an meine Form und erhalte folgenden Fehler:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement textbox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Ursache: Innerhalb meiner Klasse arbeite ich mit einem websocket und entsprechenden Handlern:
VB.NET-Quellcode
- Public Sub New()
- websocket = New WebSocket4Net.WebSocket(Me.apiUrl,,,, Me.apiFriendlyName, Me.apiOrigin, WebSocket4Net.WebSocketVersion.Rfc6455,, Security.Authentication.SslProtocols.Tls12)
- AddHandler websocket.Opened, AddressOf socketOpened
- AddHandler websocket.Error, AddressOf socketError
- AddHandler websocket.Closed, AddressOf socketClosed
- AddHandler websocket.MessageReceived, AddressOf socketMessage
- AddHandler websocket.DataReceived, AddressOf socketDataReceived
- End Sub
Hier wird das Event ausgelößt..
Und hier kommt es zur Ausnahme:
VB.NET-Quellcode
- Public Class Form1
- Public WithEvents API As New Webmana.BitcoinAPI(My.Settings.api_key, My.Settings.api_secret, False, False)
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
- API.connect()
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
- API.disconnect()
- End Sub
- Private Sub API_Connected() Handles API.Connected
- TextBox1.Text = "Verbunden."
- End Sub
- End Class
Mein Lösungsansatz:
Da ich hier tatsächlich Threatübergreifend arbeite, dachte ich mir, dass ich einen Forms.Timer in meine Klasse einbaue und die Events nicht direkt aus den Websocket-Handlern aufrufe, sondern in einer List zwischenspeichere und dann über das Tick-Ereignis des Timers auslöse.
Wenn ich aber eine List(of String) für den Event-Namen und eine List(of Args) für die Event-Argumente erstelle, wie löse ich dann im Tick-Ereignis des Timers das Event aus?
VB.NET-Quellcode
- Namespace Webmana
- Public Class BitcoinAPI
- Public Event Connected(sender As object)
- Private eventNames As New List(Of String)
- Private eventArgs As New List(Of Object)
- Private Sub listEvent(evName As String, evArg As Object)
- eventNames.add(evName)
- eventArgs.add(evArg)
- End Sub
- Private WithEvents eventRaiser As New Timer
- Public Sub New()
- eventRaiser.Interval = 1
- eventRaiser.Start()
- End Sub
- Private Sub eventRaiser_Tick(sender As Object, e As EventArgs) Handles eventRaiser.Tick
- For i As Integer = 0 To eventNames.Count() - 1
- RaiseEvent eventNames(i)(eventArgs(i)) '<-- Gibt es überhaupt so eine Möglichkeit? Ein Event anhand seines Namens aus einem String aufzurufen?
- Next
- End Sub
- End Class
- End Namespace
Vielleicht wisst ihr ja eine Lösung oder einen anderen Weg, wie ich möglichst Realtime meine Events an die Form gesendet bekomme und dort auf Steuerelemente zugreifen kann, obwohl ich mich in einem anderen Thread befinde.
Danke schonmal und Lg Hassowuff
__________________________
01: CLS : SCREEN 12
02: LINE (0, 20)-(640, 22), 15, BF
03: ECHO "MFG HASSOWUFF"
[F5]
01: CLS : SCREEN 12
02: LINE (0, 20)-(640, 22), 15, BF
03: ECHO "MFG HASSOWUFF"
[F5]