Threading mit exit event

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Threading mit exit event

    Hi,

    ich versuche gerade ein event einzubauen in mein code dieser soll mir dann sagen wann der thread fertig ist und dann soll in dem event eine einspeisung in eine LVW geschehen.

    Den code habe ich von der MS seite msdn.microsoft.com/de-de/library/Bb979513.aspx
    er geht auch ohne probleme halt nur das mit dem event bekomme ich nicht hin. im event wenn er versucht auf die lvw zuzu greifgen gibs fehler.

    ->
    Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

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

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public MustInherit Class ThreadWrapperBase
    2. Public Shared Event Completed()
    3. ' Dies ist der Thread, in dem der Task ausgeführt wird.
    4. Public ReadOnly Thread As System.Threading.Thread
    5. Public Sub New()
    6. ' Thread erstellen.
    7. Me.Thread = New System.Threading.Thread(AddressOf Me.StartTask)
    8. End Sub
    9. ' Den Task im Arbeits-Thread starten.
    10. Public Overridable Sub Start()
    11. Me.Thread.Start()
    12. End Sub
    13. ' Den Task durch einen Abbruch des Threads stoppen.
    14. ' Sie können diese Methode überschreiben, um stattdessen
    15. ' eine ordentliche Stopp-Anforderung zu verwenden.
    16. Public Overridable Sub [Stop]()
    17. Me.Thread.Abort()
    18. End Sub
    19. ' Den Status des Tasks überwachen.
    20. Private _IsCompleted As Boolean
    21. Public ReadOnly Property IsCompleted() As Boolean
    22. Get
    23. Return _IsCompleted
    24. End Get
    25. End Property
    26. Private Sub StartTask()
    27. _IsCompleted = False
    28. DoTask()
    29. _IsCompleted = True
    30. RaiseEvent Completed() 'Fehler
    31. End Sub
    32. ' Diese Methode enthält den Code, der die eigentliche Aufgabe ausführt.
    33. Protected MustOverride Sub DoTask()
    34. End Class


    VB.NET-Quellcode

    1. WithEvents ThreadFertig As New Suchen
    2. Private Sub MBtn2_Click(sender As Object, e As EventArgs) Handles MBtn2.Click
    3. Dim a As New Suchen
    4. a.Start()
    5. End Sub
    6. Private Sub ThreadFertig_Completed() Handles ThreadFertig.Completed
    7. With ListView1
    8. .Items.Clear()
    9. For i = 0 To SenderlistAktuell.Tables("SenderOut").Rows.Count - 1
    10. Dim row As DataRow = SenderlistAktuell.Tables("SenderOut").Rows(i)
    11. Dim g As String = CStr(row("Provider"))
    12. .Groups.Add(New ListViewGroup(g, g)) 'Fehler
    13. .Items.Add(New ListViewItem(New String() {CStr(row("Sender")), CStr(row("Track"))}, .Groups(CStr(row("Provider"))))) 'Fehler
    14. Next
    15. .AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize) 'Fehler
    16. End With
    17. End Sub



    Und keine Sprüche wie VB lernen oder Benutz irg. suche das wird gemeldet ! Sonst danke für richtige Hilfe!!!
    erst wollte ich die lösung schreiben, dann hab ich gesehen das die im obereren bereich des tuts vorkommt, welches du selber gepostet und offensichtlich nicht richtig durchgearbeitet hast.

    €dit, nachtrag: wenn du jemanden suchst der dir die tuts vorkaut dann meld dich mit ner preisvorstellung per pn.
    Vorher hatte ich es so

    VB.NET-Quellcode

    1. Me.Invoke(Sub() .Groups.Add(New ListViewGroup(g, g)))​


    Fehler-> Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
    Ich würde empfehlen, anstatt diesen workarounds einfach ​Async/Await zu nutzen. Dann brauchst du keine Klasse mehr - du machst einfach Await Task.StartNew(Sub() ...)​ bzw. ​Await Task(Of Bla).StartNew(Function() ...).