CTP Async

  • VB.NET

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

    @Vorposter: Na für das einfache Programmieren Asynchron laufender Anwendungen, ohne sich groß mit Threads und Invokes rumzuschlagen...

    Sieht interessant aus habs mir noch nicht genauers angeguckt, aber eins frag ich mich noch...

    VB.NET-Quellcode

    1. Public Async Function SumPageSizesAsync(uris As IList(Of Uri)) As Task(Of Integer)
    2.     Dim total As Integer = 0
    3.     For Each uri In uris
    4.         statusText.Text = String.Format("Found {0} bytes ...", total)
    5.         Dim data = Await New WebClient().DownloadDataAsync(uri)
    6.         total += data.Length
    7.     Next
    8.     statusText.Text = String.Format("Found {0} bytes total", total)
    9.     Return total
    10. End Function

    Also in Zeile 5 das Await sorgt dafür, dass der nachfolgende Code erst ausgeführt wird, wenn der Download fertig ist, aber die GUI nicht einfriert?!

    Wär ja genial und auch Code sparend ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Also in Zeile 5 das Await sorgt dafür, dass der nachfolgende Code erst ausgeführt wird, wenn der Download fertig ist, aber die GUI nicht einfriert?!

    Steht im docx. Intern legt der Compiler einfach einen Callback auf die nächste Zeile an, so dass der Code an der Stelle forgesetzt wird. Das "wait" betrifft also nur die Codeausführung in dieser Methode und blockt nicht den GUI-Thread. Coole Sache das ;)
    Die ganze Entwicklung in diesem Thema ist höllisch interessant. (Vor allem, wie man solch komplexe Vorgänge brauchbar in die vorhandenen Programmiersprachen einbindet.) Bei LINQ hat diese Integration schon sehr gut geklappt.

    BTW: Für alle VB-Skeptiker:
    In diesem Video wird u.a. gesprochen über: "the future of VB and C# and the distant future of VB and C#". Also nichts mit Ende von VB. (für die, die es nicht glauben, wenn man es ihnen sagt.)
    Quelle:
    blogs.msdn.com/b/vbteam/archive/2010/10/28/async.aspx

    VB.NET-Quellcode

    1. Async Function WaitOnTablesAsync() As System.Threading.Tasks.Task(Of Decimal)
    2. Dim takings As Decimal = 0D
    3. While Not TimeToGoHome
    4. DeliverMenus()
    5. Await GetOrdersAsync()
    6. Await WaitForKitchenAsync()
    7. GetFoodFromKitchen()
    8. GiveFoodToPatrons()
    9. Await WaitForPatronsToFinish()
    10. takings += Await GetPayment()
    11. End While
    12. Return takings
    13. End Function
    14. Async Sub Button1_Click() Handles Button1.Click
    15. Dim takings As Decimal = Await WaitOnTablesAsync()
    16. MessageBox.Show("Shift finished; took {0}", takings)
    17. End Sub


    Diese Beispiel ist auch im verlinkten Video weiter oben zu finden. (inklusive Erläuterung). Der große Vorteil hiervon ist die Vermeidung von Spagetti-Code, wenn man zB. auf herkömmliche Weise asynchron Daten uploadet. Dann sollte man Vorgänge definieren, um nach erfolgen Upload korrekt weiterzumachen.
    Async erleichtert diese Vorgänge, weil im Quellcode ersichtlich ist, wie es weitergeht.
    Also, dassichdas richtig verstehe:
    Mit Await kann man eine blockierende Methode aufrufen, die dann nicht mehr den ganzen Thread blockiert, sondern nur den Aufrufer suspendiert, bis die Daten da sind.
    Beispiel aus der Kurts Link:

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click() Handles Button1.Click
    2. Dim url = "http://blogs.msdn.com/lucian/rss.aspx"
    3. Dim wc As New WebClient
    4. Dim result As String = Await wc.DownloadStringTaskAsync(url)
    5. Dim rss As XDocument = XDocument.Parse(result)
    6. MessageBox.Show(rss.DescendantNodes.Count)
    7. End Sub
    Die Methode Button1_Click setzt erst dann in Zeile 5 fort, wenn der Download fertig ist.

    Trotzdem blockiert das Gui nicht.
    Und diese Hexerei erfolgt auchnoch ohne zusätzliche Inanspruchnahme einer Thread-Resource! Also ich stimme ein in den Reigen der Begeisterten :thumbsup:

    Nurnoch zu jvbsls Code:
    Der wird wohl daran scheitern, dasser keine blockierende Methode aufruft, sondern eine, die eh asynchron ist.
    Und wennerdas ändert aufs blockierende

    VB.NET-Quellcode

    1. WebClient().DownloadData(uri)
    hatter immer noch den Nachteil, dass die Uris nicht parallel abgefahren werden, sondern immer eine nach der anneren.

    Wird man für paralleles Abfahren von so Download-Sachen weiterhin Threads benötigen?
    Ich hab den Code nicht selbst geschrieben sondern eben aus der docx geholt :P

    Steht im docx. Intern legt der Compiler einfach einen Callback auf die nächste Zeile an, so dass der Code an der Stelle forgesetzt wird. Das "wait" betrifft also nur die Codeausführung in dieser Methode und blockt nicht den GUI-Thread. Coole Sache das ;)

    Danke wollte mich nur vergewissern, ob es so ist und ich es richtig verstanden hatte... ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ach, das whitepaper!
    jo - das von Post#3 steht tatsächlich so drin.
    Habichnurnoch das Problem, dasses bereits eine Sub WebClient.DownloadDataAsync gibt (also ohne Rückgabewert).
    Wie bringen die das hin, auf einmal einen Task(Of Byte()) zurückzuerhalten - haben die die WebClient-Klasse geändert?

    Auch mit Extensions ist AFAIK sowas nicht drin: Existiert zu einer Extension eine gleichnamige ObjektMethode, so hat letztere Vorrang, und die Extension wird ignoriert.

    @jvbsl:
    Aussm Link von der Kurt:
    Asynchrony does not mean "running on a background thread". Running on a background thread is one way to implement asynchrony, but it's not the only way, and it's often not the best way.
    Asynchrony does not mean "running on a background thread". Running on a background thread is one way to implement asynchrony, but it's not the only way, and it's often not the best way.

    There are no additional threads in the above code. There's only a single thread, the UI thread. The Async modifier does not create additional threads. All it does is mark a method as asynchronous (and allow it to Await). If you want to do work on a background thread, you will have to do so explicitly using TaskEx.Run:

    Aber wie das geht, habich ja schon erklärt: Hexerei ;)

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