Ich erstelle eine Anwendung die verschiedene Chatdienste verbinden kann. Dabei repräsentieren die ...Task Klasse die einzelnen Verbindungen (je in einer Liste gespeichert) und empfangen über AddMessage sowohl externe Nachrichten sowie interne Nachrichten. Ist eine Nachricht intern soll ein Event gefeuert werden. Die internen nachrichten kommen aus der ... Bridge klasse, die sich untereinander sehr unterscheiden, in diesem Beispiel ist die TaskBridge ein OffScreen Browser in einem eigenem Thread.
So wird zum Beispiel eine externe Nachricht gesndet:
Das Problem ist, dass das Event in AddMessage nicht weitergeleitet wird, RasieEvent wird aber ausgeführt.
Hier die TawkTask Klasse:
Der TawkTask wird wie folgt erstellt:
zu guter letzt das main Modul:
Da die Aufrufe intern alle Funktionieren muss irgendwo bei der Bindung des Events ein Problem auftauchen. Aber eigentlich sollte
So wird zum Beispiel eine externe Nachricht gesndet:
SGS.Tawk.SendToTawk(p.send, p)
Von Intern aus der ...Bridge kommend: parent.AddMesssage(CreateProtocolFromMessage(parent.sender, "Es konnte keine Verbindung hergestellt werden."), True)
Das Problem ist, dass das Event in AddMessage nicht weitergeleitet wird, RasieEvent wird aber ausgeführt.
Hier die TawkTask Klasse:
VB.NET-Quellcode
- Namespace SGS.Tawk
- Public Class TawkTask
- Public bridgeThread As System.Threading.Thread
- Public sender As String
- Public tawkbridge As TawkBridge
- Public messageStack As New List(Of Protocoll.SylGa)
- Public Delegate Sub NewMessagemEventHandler(sender As Object, e As NewMessageEventArgs)
- Public Event NewMessage As NewMessagemEventHandler
- Friend Sub AddMesssage(ByVal e As Protocoll.SylGa, Optional ByVal internal As Boolean = False)
- If internal Then
- OnNewMessage(New NewMessageEventArgs(e))
- Else
- SyncLock messageStack
- messageStack.Add(e)
- End SyncLock
- End If
- End Sub
- Protected Overridable Sub OnNewMessage(e As NewMessageEventArgs)
- RaiseEvent NewMessage(Me, e)
- End Sub
- Sub New(ByVal user As String, ByVal firstMessage As Protocoll.SylGa)
- AddMesssage(firstMessage)
- sender = user
- tawkbridge = New TawkBridge(Me)
- bridgeThread = New System.Threading.Thread(AddressOf tawkbridge.MainLoop)
- bridgeThread.Start()
- End Sub
- End Class
- End Namespace
Der TawkTask wird wie folgt erstellt:
VB.NET-Quellcode
- Namespace SGS.Tawk
- Module TawkAction
- Public tawkThreads As New List(Of TawkTask)
- Sub SendToTawk(ByVal user As String, ByVal firstMessage As Protocoll.SylGa)
- Dim t As TawkTask = findTawk(user)
- If t Is Nothing Then
- t = New TawkTask(user, firstMessage)
- AddHandler t.NewMessage, AddressOf SGS.main.MessageDispatcher
- tawkThreads.Add(t)
- End If
- End Sub
- Function findTawk(ByVal user As String) As Tawk.TawkTask
- For Each tawk As TawkTask In tawkThreads
- If tawk.sender = user Then
- Return tawk
- End If
- Next
- Return Nothing
- End Function
- End Module
- End Namespace
zu guter letzt das main Modul:
Da die Aufrufe intern alle Funktionieren muss irgendwo bei der Bindung des Events ein Problem auftauchen. Aber eigentlich sollte
AddHandler t.NewMessage, AddressOf SGS.main.MessageDispatcher
funktionieren. Aber Tipps wäre ich sehr erfreut!