Thread Wrapper Klasse um Finished-Event erweitern

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

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

    Thread Wrapper Klasse um Finished-Event erweitern

    Hallo,

    Ich habe unter msdn.microsoft.com/de-de/library/bb979513.aspx eine ThreadWrapper klasse gefunden, die ich gerne verwenden möchte. Grundsätzlich funktioniert diese auch wunderbar.
    Allerdings möchte ich nun ein event hinzufügen, dass aufgerufen wird, wenn der Thread beendet wird. Dabe ist folgendes entstanden:

    VB.NET-Quellcode

    1. Public MustInherit Class ThreadWrapper
    2. 'Quelle: http://msdn.microsoft.com/de-de/library/bb979513.aspx
    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. 'With Me.Thread
    9. ' .IsBackground = True
    10. ' .Priority = Threading.ThreadPriority.AboveNormal
    11. ' .Name = "Thread_Irgendwas"
    12. 'End With
    13. End Sub
    14. ' Den Task im Arbeits-Thread starten.
    15. Public Overridable Sub Start()
    16. Me.Thread.Start()
    17. End Sub
    18. ' Den Task durch einen Abbruch des Threads stoppen.
    19. ' Sie können diese Methode überschreiben, um stattdessen
    20. ' eine ordentliche Stopp-Anforderung zu verwenden.
    21. Public Overridable Sub [Stop]()
    22. MsgBox("Thread wurde abgebrochen!")
    23. Me.Thread.Abort()
    24. End Sub
    25. ' Den Status des Tasks überwachen.
    26. Private _IsRunning As Boolean = False
    27. Public ReadOnly Property IsRunning() As Boolean
    28. Get
    29. Return _IsRunning
    30. End Get
    31. End Property
    32. Private Sub StartTask()
    33. _IsRunning = True
    34. DoTask()
    35. RaiseEvent_ThreadComplete()
    36. _IsRunning = False
    37. End Sub
    38. ' Diese Methode enthält den Code, der die eigentliche Aufgabe ausführt.
    39. Protected MustOverride Sub DoTask()
    40. Public Sub RaiseEvent_ThreadComplete()
    41. RaiseEvent ThreadComplete()
    42. End Sub
    43. Public Event ThreadComplete()
    44. End Class


    In der Aufrufenden Klasse habe ich mir ein Sub erstellt, dass nach dem Thread aufgerufen werden soll:

    VB.NET-Quellcode

    1. AddHandler Todo.ThreadComplete, AddressOf Me.fertig
    2. Public Sub fertig()
    3. lblFertig.Text = "Fertig"
    4. end Sub


    Leider bekomme ich immer die Fehlermeldung: {"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lblFertig erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."}

    Laut meinen Recherchen müsste ich mit InvokeRequired abfragen, ob ein Invoke notwendig ist. Da es sich aber bei ThreadWrapper sowie der davon erbenden Klasse um eine Normale Klasse und nicht um ein Form handelt, ist natürlich die Methode InvokeRquired nicht verfügbar.
    Hat jemand einen tipp für mich, wie ich das ganze lösen kann?
    Im Prinzip soll in der Aufrufendne form ein Event ausgelöst / eine Funktion aufgerufen werden, wenn der Thread beendet wurde.

    Danke im Voraus
    Du brauchst InvokeRequired nicht abfragen, denn Invoking ist garantiert requiered, also das weißt du auch so.
    Mit Application.OpenForms(0) ist anwendungsweit ein Form gegeben, was du für Invokings gebrauchen kannst.

    Du kannst dir auch meine ThreadWrapperklasse angucken, die bringt glaub noch bischen mehr als das Msdn-Teil:
    codeproject.com/Articles/60382…ackgroundWorker-and-about
    Danke für eure Antworten!

    @ErfinderDesRades :
    Ich musste die Exceptions in "Normale Exceptions" umwandeln und den Namespace entfernen, damit das ding überhaubt in meinem bestehenden Projekt Kompiliert.
    Beginne jetzt mit dem ausprobieren.
    @Mojo :
    Da ich .net 3.5 verwende gibts die Tasks Llasse noch nicht.

    Danke
    lg

    tScheckSn schrieb:

    Ich musste die Exceptions in "Normale Exceptions" umwandeln und den Namespace entfernen, damit das ding überhaubt in meinem bestehenden Projekt Kompiliert.
    Sieht mir danach aus, dass du es falsch eingebunden hast, denn wenns in meinem Projekt funktioniert, dann musses auch in deinem funktionieren - ohne Änderungen am Code.

    Also wenn jetzt noch Probleme auftreten, kann ich nix mehr zu sagen, denn wir sprechen über verschiedene Dinge.

    Edit: nochma nachgeguckt, jepp - der AsyncWorker etc. ist in einem eigenen Helpers-Projekt, und wenn du dich mit dem Zusammenbinden mehrere Projekte nicht auskennst, kannst dus nur falsch machen.
    gugge Video: HelperProjekt einbinden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich weis wie man eine DLL einbindet, habe aber meine eigene "Common.dll", in der ich solche funktionen ablege.
    Da ich keinen dll wildwuchs möchte hab ich in meiner DLL klassen mit selben namen wie in der Helpers.dll angelegt und den Sourcecode kopiert.
    Das funktionierte wire berichtet anfangs nicht, mit den genannten anpassungen aber sehr gut.
    Danke
    nochmal