Unterschied zwischen Benutzung von Async Sub und Async Task(of Type)

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

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Neu

    Es muss halt irgendeinen Loading State geben. Daher braucht man halt ein default value, das Ladestatus impliziert oder einen generellen Ladestatus im Formular (je nach Fall). Aber ja, wohl aus dem Grund gibt es keine async properties, weil es semantisch eben keinen Sinn macht. Wenn man die unterschiedlichen Status fest definieren würde, könnte man Properties sich so verhalten lassen. Aber das trifft zu viele Annahmen. Daher wurde das denke ich (verständlicherweise) nicht gemacht.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Neu

    Hab mich jetzt für die Idee von @DTF aus Post #13 mit dem Event entschieden, funktioniert wunderbar...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private ReadOnly Klient As New HttpClient
    2. Private CoverArtsFromPfad As New List(Of ImageSource)
    3. Public Event CoverArtFromPfadFetched()
    4. Private _CoverArtInFiles As List(Of ImageSource)
    5. <JsonIgnore>
    6. Public Property CoverArtInFiles As List(Of ImageSource)
    7. Get
    8. If _CoverArtInFiles Is Nothing Then
    9. Return FetchCoverArts()
    10. End If
    11. Return _CoverArtInFiles
    12. End Get
    13. Set(value As List(Of ImageSource))
    14. _CoverArtInFiles = value
    15. RaisePropertyChanged()
    16. End Set
    17. End Property
    18. Private Sub NewCoverArtAvailable()
    19. CoverArtInFiles = CoverArtsFromPfad
    20. End Sub
    21. Public Function FetchCoverArts() As List(Of ImageSource)
    22. If (ModelObjekt.CoverArtInFiles IsNot Nothing) Then
    23. If (ModelObjekt.CoverArtInFiles.Count > 0) Then
    24. Return ModelObjekt.CoverArtInFiles
    25. End If
    26. End If
    27. Dim uriResult As Uri = Nothing
    28. Dim result As Boolean = Uri.TryCreate(CoverArtPfad, UriKind.Absolute, uriResult) AndAlso (uriResult.Scheme = Uri.UriSchemeHttp OrElse uriResult.Scheme = Uri.UriSchemeHttps)
    29. If Not Stream Then
    30. Dim MeinTrack As ATL.Track = New ATL.Track(Dateiname)
    31. Dim GefundeneCoverArts As System.Collections.Generic.IList(Of PictureInfo) = MeinTrack.EmbeddedPictures
    32. If GefundeneCoverArts.Count > 0 Then
    33. Dim ImageListe As New List(Of ImageSource)
    34. For Each Bild In GefundeneCoverArts
    35. ImageListe.Add(BitmapToImageSource(New Bitmap(System.Drawing.Image.FromStream(New MemoryStream(Bild.PictureData)))))
    36. Next
    37. Return ImageListe
    38. Else
    39. GetCoverArtFromCoverArtPfad(CoverArtPfad, result)
    40. End If
    41. Else
    42. GetCoverArtFromCoverArtPfad(CoverArtPfad, result)
    43. End If
    44. End Function
    45. Private Async Sub GetCoverArtFromCoverArtPfad(Pfad As String, URLIsValid As Boolean)
    46. AddHandler Me.CoverArtFromPfadFetched, AddressOf NewCoverArtAvailable
    47. Dim retList As New List(Of ImageSource)
    48. If System.IO.File.Exists(Pfad) Then
    49. Try
    50. Dim memStream As MemoryStream = New MemoryStream(System.IO.File.ReadAllBytes(Pfad))
    51. retList.Add(BitmapToImageSource(New Bitmap(System.Drawing.Image.FromStream(memStream))))
    52. CoverArtsFromPfad = retList
    53. RaiseEvent CoverArtFromPfadFetched()
    54. Catch ex As Exception
    55. CoverArtsFromPfad = Nothing
    56. RaiseEvent CoverArtFromPfadFetched()
    57. End Try
    58. ElseIf URLIsValid Then
    59. Try
    60. retList.Add(BitmapToImageSource(New Bitmap(System.Drawing.Image.FromStream(Await GetCoverFromWeb(Pfad)))))
    61. CoverArtsFromPfad = retList
    62. RaiseEvent CoverArtFromPfadFetched()
    63. Catch ex As Exception
    64. CoverArtsFromPfad = Nothing
    65. RaiseEvent CoverArtFromPfadFetched()
    66. End Try
    67. Else
    68. CoverArtsFromPfad = Nothing
    69. RaiseEvent CoverArtFromPfadFetched()
    70. End If
    71. RemoveHandler Me.CoverArtFromPfadFetched, AddressOf NewCoverArtAvailable
    72. End Sub

    Neu

    Warum brauchst du jetzt noch das Event? Das ist eigentlich redundant. Du kannst doch auch in der Methode direkt die Property setzen. Im Endeffekt machst du jetzt nichts anderes, außer dass du noch den Weg über ein Event zusätzlich gehst. Dieses wird manuell im selben Thread von dir geworfen und bringt somit an der Stelle keinen Mehrwert, weil du den Handlercode direkt integrieren kannst. Du deabonnierst es schließlich auch direkt wieder. Events machen ja nur Sinn, wenn andere Instanzen etwas mitkriegen wollen oder du z.B. asynchrone Arbeit mit dem EAP abfangen willst. Innerhalb derselben Klasse hast du ja eh schon die volle Kontrolle sonst.

    Deine Property wirft ja auch PropertyChanged für die UI, d.h. da musst du ja sonst auch nichts an irgendein Event binden.

    Viele Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

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