Thread wird zu früh beendet

  • VB.NET

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

    naja, das wichtigste Prinzip beim Threading ist: man solls bleiben lassen, wenn man auch ohne auskommt.

    ist vlt. ein ganz allgemeines Prinzip, weil gilt für ganz verschiedene Bereiche, wie: OwnerDrawing, Datenbanken, PlugIns, ...

    jo, ganz allgemein: Kiss

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

    ErfinderDesRades schrieb:

    naja, das wichtigste Prinzip beim Threading ist: man solls bleiben lassen, wenn man auch ohne auskommt.

    MS neues Paradigma: Jede (!) Funktion, die länger als 15 ms dauern KÖNNTE (!), sollte "async" laufen.

    VB.NET-Quellcode

    1. Imports AsyncCtpExtensions
    2. Imports System.Threading.Tasks
    3. Public Class Form1
    4. Private Function Quick() As Boolean
    5. Return True
    6. End Function
    7. Private Async Function QuickAsync() As Task(Of Boolean)
    8. Return Await (New TaskFactory(Of Boolean)).StartNew(Function() As Boolean
    9. Return True
    10. End Function)
    11. End Function
    12. Private Function Measure() As Stopwatch
    13. GC.Collect()
    14. GC.WaitForPendingFinalizers()
    15. GC.Collect()
    16. Return Stopwatch.StartNew
    17. End Function
    18. Private Sub tm_Tick(sender As Object, e As System.EventArgs) Handles tm.Tick
    19. Me.Text = Now.ToString
    20. End Sub
    21. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    22. Dim s = Measure()
    23. Dim b As Boolean = Quick()
    24. s.Stop()
    25. Debug.Print("Sync Time: " & s.ElapsedTicks)
    26. End Sub
    27. Private Async Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    28. Dim s = Measure()
    29. Dim b As Boolean = Await QuickAsync()
    30. s.Stop()
    31. Debug.Print("Async Time: " & s.ElapsedTicks)
    32. End Sub
    33. End Class


    Synchron: 1-5 Ticks
    Asynchron: ca 1.000 Ticks (also 0.1 ms)

    dh bei SEHR kleinen Funktionen gibts schon einen ziemlichen Overhead, der sich aber schnell relativiert.
    Das gut.
    Nur zum Verständnis mit den Delegaten (ob ich da richtig liege):
    Ein Delegate ist nichts anders als ein Zeiger für eine Funktion. In diesem Fall zeigt dieser Delegate dann von Thread B (Watcher) in den Hauptthread zurück. Deswegen kann das Mailsenden auch ohne Probleme ausgeführt werden. Liege ich mit dieser Annahme richtig?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Delegaten können noch bisserl mehr, als die ollen c-Function-Pointer.
    v.a. sind sie typisiert, d.h., ein Delegat kann nur auf die für ihn passenden Methoden zeigen.

    Delegaten sind auch was hinter dem Event-Mechanismus steckt - gugge Alles über Events

    Auch hat ein Delegat eingebaute Methoden, um im Nebenthread ausgeführt zu wern.

    Ordentlich behandelt wird das Thema in dieses Buch Lesen