Parallel.For von Iteratorfunktion

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

Es gibt 80 Antworten in diesem Thema. Der letzte Beitrag () ist von Daniel Baumert.

    Parallel.For von Iteratorfunktion

    Hallo.

    Und zwar habe ich derzeit folgende Foreach Schleife:

    VB.NET-Quellcode

    1. For Each t As Tuple(Of String, String, String) In Zipp(StartComCrawl(Gender, MinAge, MaxAge), StartNormal(fNS), StartIntC(Gender, MinAge, MaxAge), Function(l, r, k) Tuple.Create(l, r, k))


    Kann mir jemand sagen , wie ich das per Paralle.ForEach machen kann?

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

    Daniel Baumert schrieb:

    Parallel.ForEach
    machst Du zunächst ohne Lambda-Ausdrücke, also mit einem Next am Ende.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber die Zipp Funktion sieht so aus:

    VB.NET-Quellcode

    1. Private Iterator Function Zipp(Of T1, T2, T3, TResult)(first As IEnumerable(Of T1), second As IEnumerable(Of T2), third As IEnumerable(Of T3), result As Func(Of T1, T2, T3, TResult)) As IEnumerable(Of TResult)


    Wie bekomm ich nun die Parall.ForEach hin=?
    Hm, also da meckert der:

    VB.NET-Quellcode

    1. Parallel.ForEach(Zipp(StartComCrawl(Gender, MinAge, MaxAge), StartNormal(fNS), StartInterestC(Gender, MinAge, MaxAge), Function(l, r, k) Tuple.Create(l, r, k)))


    Fehler bei der Überladungsauflösung, da keine zugreifbare "ForEach" diese Anzahl von Argumenten akzeptiert.

    Hab auch keine Ahnung, wie ich die ohne die inline Funktion nutzen soll ehrlichgesagt
    Ahh.. Hatte eine Klammer vergessen:

    VB.NET-Quellcode

    1. Parallel.ForEach(NullableZip(StartComCrawl(Gender, MinAge, MaxAge), StartNormal(fNS), StartIntC(Gender, MinAge, MaxAge)), Function(l, r, k) Tuple.Create(l, r, k))


    Trotzdem meckert der und sagt:

    VB.NET-Quellcode

    1. Für den Parameter "result" von "Private Iterator Function NullableZip(Of T1, T2, T3, TResult)(first As System.Collections.Generic.IEnumerable(Of T1), second As System.Collections.Generic.IEnumerable(Of T2), third As System.Collections.Generic.IEnumerable(Of T3), result As System.Func(Of T1, T2, T3, TResult)) As System.Collections.Generic.IEnumerable(Of TResult)" wurde kein Argument angegeben.


    Aber Paralle.ForEach hat doch als Parameter (Input , Variable). Verstehe ich ehrlich gesagt nicht

    VB.NET-Quellcode

    1. Dim B As New List(Of Integer) From {9, 23, 10, 2, 7, 6, 100, 43, 99}
    2. Parallel.ForEach(B, Sub(x) Me.Invoke(Sub() ListBox1.Items.Add(x)))

    Sehe den Sinn dahinter aber nicht. Ich weiß ja Prinzipiell wie es funktioniert.

    Ich hätte mich nicht gemeldet, wenn ich garkeine Ahnung davon hätte.

    VB.NET-Quellcode

    1. For Each t As Tuple(Of String, String, String) In Zipp(StartComCrawl(Gender, MinAge, MaxAge), StartNormal(fNS), StartIntC(Gender, MinAge, MaxAge),
    2. Function(l, r, k) Tuple.Create(l, r, k))
    3. Next


    Und nun?

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

    das ist zum einen grauenhaft gelayoutet, zum anderen nicht mehr äquivalent zu deim PF-Bandwurm
    guggemol dieses:

    VB.NET-Quellcode

    1. Dim comCrawl = StartComCrawl(Gender, MinAge, MaxAge)
    2. Dim normal = StartNormal(fNS)
    3. Dim interestC = StartInterestC(Gender, MinAge, MaxAge)
    4. Dim zipped = Zipp(comCrawl, normal, interestC, Function(l, r, k) Tuple.Create(l, r, k))
    5. Parallel.ForEach(zipped)
    So teilt man Bandwürmer auf
    Das klappt, aber die Methode in der ich diesen Code habe, ist
    eine Iterator Funktion die IEnumerable(Of String) zurückgibt.


    Wie krieg ich das gemeistert?

    Ich müsste also in der Parallel.ForEach auch noch yielden können.

    Ist das so richtig?

    VB.NET-Quellcode

    1. Parallel.ForEach(zipped, Iterator Function(x As Tuple(Of String, String, String)) As IEnumerable(Of String)
    2. Yield x.Item1
    3. Yield x.Item2
    4. Yield x.Item3
    5. End Function)
    unnötiges Vollzitat entfernt
    -ErfinderDesRades



    Jedes Mal werden diese passepartouts geschrieben ;)

    Es erscheint kein Fehler in der IDE , es werden einfach keine Strings zurückgegeben.

    Würde da ein Fehler erscheinen, so hätte ich diesen schon mitgeteilt.

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

    das mitte passpartouts verstehe ich nicht - meinst du damit den Link?

    immerhin lässt du dich schonmal herbei, das Fehlverhalten näher zu beschreiben, als "klappt nicht".

    Nun noch mitteilen, auf welchen Code sich das bezieht - halt die Fragestellung so gestalten, wie im Link vorgeschlagen.

    also am besten mit aktuellem CodeSnippet - in vernünftigem Layout.
    Gerne auch eine ganze Function, weil "zurückgeben" hat immer was mit ganzen Functions zu tun.

    Falls die Function aber >20 Zeilen, dann mach eine kleinere, mit der man das Fehlverhalten reproduzieren kann.

    Ups: Aber vlt. hast du mit mir eh pech: Da ich nur 2010 habe, kann ich zumindest mit Iteratoren keine Experimente machen.
    Aber wie man gelegentlich hört: Eine gute Fragestellung erhöht ganz allgemein die Chancen auf gute Antworten.
    Code:

    VB.NET-Quellcode

    1. Private Iterator Function Zipp(Of T1, T2, T3, TResult)(first As IEnumerable(Of T1), second As IEnumerable(Of T2), third As IEnumerable(Of T3), result As Func(Of T1, T2, T3, TResult)) As IEnumerable(Of TResult)
    2. 'blabla
    3. '...
    4. End Function
    5. Public Iterator Function StartCom() As IEnumerable(Of String)
    6. '...
    7. End Function
    8. Public Iterator Function StartNormal() As IEnumerable(Of String)
    9. '...
    10. End Function
    11. Public Iterator Function StartInterest() As IEnumerable(Of String)
    12. '...
    13. End Function
    14. Public Iterator Function Starting() As IEnumerable(Of String)
    15. Dim ComCra As IEnumerable(Of String) = StartCom()
    16. Dim NormalS As IEnumerable(Of String) = StartNormal()
    17. Dim InterestC As IEnumerable(Of String) = StartInterestC()
    18. Dim zipped As IEnumerable(Of Tuple(Of String, String, String)) = Zipp(ComCra, NormalS, InterestC, Function(l, r, k) Tuple.Create(l, r, k))
    19. Parallel.ForEach(zipped, Iterator Function(x As Tuple(Of String, String, String)) As IEnumerable(Of String)
    20. Yield x.Item1
    21. Yield x.Item2
    22. Yield x.Item3
    23. If n = 0 Then
    24. RaiseOnState("Running!")
    25. n = 1
    26. End If
    27. End Function)