WinFuture-Forum.de: [VB.NET] probleme mit eigenen eventargs - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[VB.NET] probleme mit eigenen eventargs Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich


#1 Mitglied ist offline   ::YC Tech:: 

  • Gruppe: aktive Mitglieder
  • Beiträge: 170
  • Beigetreten: 01. Oktober 11
  • Reputation: 0
  • Geschlecht:Männlich
  • Interessen:An PCs basteln bis der IT kommt :D

geschrieben 29. August 2013 - 15:50

moinsen, alle win-devs!

immernoch arbeite ich am gleichem projekt (für manche schon als "Bukkit Manager" bekannt) - dem manager für minecraft (bukkit) servern. da ich die projektmappe meines projekts verkleinern musste (hier der grund), hab ich mehrere funktionen in externe projekte bzw. klassenbibliotheken ausgelagert. somit auch die funktion, die den prozess hostet und den konsolen-text ausgibt. und da ist das problem: anstatt das alles im code-behind des hauptfensters statt findet, muss ich auf die klassenbibliothek (in diesem fall "ConsChat.dll") zugreifen. dazu hab ich in der klassenbibliothek auch entsprechende eventhandler mit eventargs erstellt:

eventargs:
da stehen dann die nötigen werte drin
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public Class ConsChatEventArgs
    Inherits EventArgs

    Public Property ConsoleLastLine As String
    'hier wird noch einiges hinzukommen

End Class


konsolen-modul:
"steuert" den prozess-host
Public Class Console

    Public Event ReceivedOutput As EventHandler(Of ConsChatEventArgs)

    Public Sub New()
        AddHandler ProcessHost.ConsoleOutput, AddressOf Server_ReceivedOutput
    End Sub

    Private Sub Server_ReceivedOutput()
        Dim eArgs As New ConsChatEventArgs
        eArgs.ConsoleLastLine = ReadLastLine()
        OnOutputReceive(eArgs)
    End Sub

    Protected Overridable Sub OnOutputReceive(e As ConsChatEventArgs)
        RaiseEvent ReceivedOutput(Me, e)
    End Sub

    Public Function ReadLastLine()
        Dim lLine As String = ProcessHost.LastLine
        Return lLine
    End Function

End Class



hauptfenster:
lässt die letzte zeile in der textbox "ConsoleBox" erscheinen
Class ManagerWindow

    Public ConsoleModule As New ConsChat.Console

    Public Sub New()
        InitializeComponent()
        AddHandler ConsoleModule.ReceivedOutput, AddressOf cOutput
    End Sub

    Private Sub cOutput(sender As Object, e As ConsChatEventArgs)
        ConsoleBox.Text &= e.ConsoleLastLine
    End Sub

End Class



nun ist aber das problem, dass ich immer folgende meldung bekomme, sobald die "cOutput"-prozedur ausgeführt wird:

Zitat

Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in WindowsBase.dll aufgetreten.

Zusätzliche Informationen: Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet.

0

Anzeige



#2 Mitglied ist offline   JackSlater91 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 19. Dezember 13
  • Reputation: 0

geschrieben 19. Dezember 2013 - 14:07

Der Fehler liegt meiner Meinung nach weniger in deinen eigenen EventArgs, sondern das diese von einem anderen Thread aus aufgerufen werden und du eine TextBox (?) verändert willst, diese laufen aber immer im Hauptthread bzw. UI-Thread, du musst das nun wieder synchronisieren.

Eine Möglichkeit zur Lösung wäre ISynchronizeInvoke und ein temporärer Delegat.

Beizeiten poste ich noch ein Beispiel.

Dieser Beitrag wurde von JackSlater91 bearbeitet: 19. Dezember 2013 - 14:08

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0