vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Re: Threadpool: Beendigung aller Threads feststellen 
Autor: Kuno60
Datum: 18.09.14 15:15

Hallo Manfred,

Async/Await ist nicht immer die beste Variante, aber in vielen Fällen eine sehr einfache Variante.

Das erste Beispiel von mir, war nicht so ideal.
Hier ein Beispiel, bei dem der Hauptthread nicht blockiert wird.
So hab ich es schon in einigen Programmen verwendet.
  Async Function Tasks() As Task
    Dim tasks(2) As Task
    tasks(0) = Task.Run(AddressOf Task1)
    tasks(1) = Task.Run(AddressOf Task2)
    tasks(2) = Task.Run(AddressOf Task3)
    Await Task.WhenAll(tasks)
    MsgBox("Alle Tasks wurden beendet.")
  End Function
Mit diesem Code lese ich eine 200 MB große XML-Datei mit einem XmlReader ein. Durch die Aufteilung auf 4 Tasks verkürzt sich die Lesezeit auf 2 Sekunden und der Hauptthread wird dabei nicht blockiert. Wenn einer der 4 Reader beendet ist, wird eine Zwischenzeit angezeigt.
  Private Async Function LeseDateiAsynchron() As Task
    Dim zeit = Date.Now
    Dim tasklist As New List(Of Task)
    tasklist.Add(Task.Run(AddressOf Leser1))
    tasklist.Add(Task.Run(AddressOf Leser2))
    tasklist.Add(Task.Run(AddressOf Leser3))
    tasklist.Add(Task.Run(AddressOf Leser4))
    While tasklist.Count > 0
      Dim tk = Await Task.WhenAny(tasklist)
      tasklist.Remove(tk)
      'Dim rg = Await tk '<- nur wenn auf einen Rückgabewert gewartet werden _
        soll.
      Me.ProgressBarFortschritt.Value += 20
      Me.LabelZeit.Text = String.Format("Zeit: {0:n1} Sek.", (Date.Now - _
        zeit).TotalSeconds)
    End While
    Me.ProgressBarFortschritt.Value = 100
  End Function
So kann z.B. der Inhalt einer Webseite asynchron gelesen werden.
Im Gegensatz zu synchronem Code, wird hier der Button wirklich deaktiviert und erst wieder aktiviert, wenn die Webseite gelesen wurde. Der Button reagiert zwischendurch auf keine Klicks und der Hauptthread wird nicht blockiert.
  Private Async Sub ButtonWeb_Click(sender As Object, e As EventArgs) Handles _
    ButtonWeb.Click
    Me.ButtonWeb.Enabled = False
    Dim inhalt = Await InhaltWebseite("...")
    '...
    Me.ButtonWeb.Enabled = True
  End Sub
 
  Private Async Function InhaltWebseite(url As String) As Task(Of String)
   Return Await New HttpClient().GetStringAsync(url)
  End Function
Man kann einzelne Tasks auch abbrechen oder mit Hilfe von Tor-Steuerung (ResetEvent) anhalten und fortsetzen.

Mit dem Threadpool hab ich bisher noch nicht direkt gearbeitet. Ich verwende fast nur Async oder BackGroundWorker und hatte damit noch nie Probleme.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Threadpool: Beendigung aller Threads feststellen1.976Manfred X17.09.14 15:41
Re: Threadpool: Beendigung aller Threads feststellen1.293ModeratorDaveS17.09.14 17:40
Re: Threadpool: Beendigung aller Threads feststellen1.305Manfred X17.09.14 17:49
Re: Threadpool: Beendigung aller Threads feststellen2.432ModeratorDaveS17.09.14 20:19
Re: Threadpool: Beendigung aller Threads feststellen1.274Manfred X18.09.14 10:15
Re: Threadpool: Beendigung aller Threads feststellen1.210ModeratorDaveS18.09.14 19:05
Re: Threadpool: Beendigung aller Threads feststellen1.372Kuno6017.09.14 22:22
Re: Threadpool: Beendigung aller Threads feststellen1.269Manfred X17.09.14 22:50
Re: Threadpool: Beendigung aller Threads feststellen1.354Kuno6018.09.14 15:15
Re: Threadpool: Beendigung aller Threads feststellen1.234Manfred X18.09.14 16:00

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel