Die Rückgabewerte mehrerer Tasks bekommen

  • VB.NET
  • .NET (FX) 4.5–4.8

    Die Rückgabewerte mehrerer Tasks bekommen

    Huhu zusammen, ich stehe vor einer Aufgabe die ich bisher immer mit Events und ggf. ner Parent Klasse gelöst habe.

    Wie würdet ihr nun diese Aufgabe mit Tasks lösen?
    Wir haben zum Beispiel einen Webservice der gleichzeitig von mehreren (virtuellen) Clients angesprochen werden soll, jede Response enthält Daten (zur Vereinfachung als Typ String.. Im Live Betrieb sind das natürlich komplexere Daten).

    Statt jetzt sowas hier zu machen und somit alle Clients hintereinander abzuarbeiten:

    VB.NET-Quellcode

    1. Dim Anworten As New List(Of String)
    2. Try
    3. For Each c As Client In Clients
    4. Antworten.Add(Await Task.Run(Function() c.HoleDieAntwort()))
    5. Next
    6. Catch ex As Exception
    7. ' whatever..
    8. End Try


    würde ich gerne so (oder ähnlich) vorgehen, dass diese Requests gleichzeitig stattfinden, ich aber irgendwie gesammelt an einer Stelle nach die Antworten bekomme:

    VB.NET-Quellcode

    1. Dim Antworten = Task.ArbeiteAlleAb(Whatever)


    Kann jemand ggf. seine Ideen mit einbringen, würde mich freuen ;)!
    Ich wüsste halt wie ichs anders löse, aber schadet ja nicht nach vorne oder auch mal zur Seite zu schauen.

    EDIT:
    Ich denke hiermit komm ich meiner gewünschten Lösung schonmal näher:
    Alpha-Lösung

    VB.NET-Quellcode

    1. Imports System.Collections.Concurrent
    2. Public Class Form1
    3. Private Jobs As New List(Of Job)
    4. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Jobs.Clear()
    6. For i As Integer = 1 To 10
    7. Jobs.Add(New Job(i))
    8. Next
    9. Dim results As New ConcurrentBag(Of String)
    10. Await Task.Run(Sub()
    11. Parallel.ForEach(Jobs, Sub(job)
    12. results.Add(job.Run())
    13. Console.WriteLine("Finished Job: " & job.ID.ToString())
    14. End Sub)
    15. End Sub)
    16. MessageBox.Show("finished")
    17. End Sub
    18. End Class
    19. Public Class Job
    20. Public Property ID As Integer
    21. Public Property Result As String
    22. Public ReadOnly Property Finished As Boolean
    23. Get
    24. Return Result <> ""
    25. End Get
    26. End Property
    27. Sub New(ID As Integer)
    28. Me.ID = ID
    29. End Sub
    30. Public Function Run() As String
    31. Using wc As New System.Net.WebClient()
    32. ' schickt die jobid an ein php skript
    33. ' das skript gibt die jobid via echo aus nachdem es eine zufällig zeit zwischen 1 und 10 sekunden gewartet hat
    34. Result = wc.DownloadString("http://meineseite.de/test.php?jobid=" & ID.ToString())
    35. End Using
    36. Return Result
    37. End Function
    38. End Class


    Hier noch das PHP Testskript:
    Spoiler anzeigen

    PHP-Quellcode

    1. <?php
    2. $jobID = $_GET['jobid'];
    3. $nr = rand(1, 10);
    4. sleep($nr);
    5. echo $jobID;


    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Rootbob91“ ()