Warten auf ein Ereignis

    • VB.NET

      Warten auf ein Ereignis

      Und da sage jemand, dass Videos nix bringen ...
      channel9.msdn.com/Series/Three…syncThreadsAndDatabinding

      Worum gehts: Um das (asynchrone) Warten auf ein Event/Ereignis. OK. Aber man soll doch nicht auf Ereignisse "warten"? Wenn sie passieren, dann soll man sie abarbeiten. Ja, stimmt schon, aber dennoch. Fakt ist nunmal es gibt jede Menge Aktionen die vom Prinzip her eigentlich "linear" sind. Aber dadurch dass man in verschiedenen Methoden auf verschiedene Ereignisse reagieren muss, LIEST sich das ganze absolut nicht mehr linear. Wer so was hat, dem kann geholfen werden:

      VB.NET-Quellcode

      1. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      2. Button1.Enabled = False
      3. Dim tcs As New TaskCompletionSource(Of Object)
      4. Dim clickhandler = Sub(snd, evt) tcs.TrySetResult(snd)
      5. Try
      6. AddHandler Button2.Click, clickhandler
      7. AddHandler Button3.Click, clickhandler
      8. MessageBox.Show("Press a button mate!")
      9. Dim result = Await tcs.Task
      10. MessageBox.Show("You pressed: " & DirectCast(result, Button).Text)
      11. Finally
      12. RemoveHandler Button2.Click, clickhandler
      13. RemoveHandler Button3.Click, clickhandler
      14. End Try
      15. Button1.Enabled = True
      16. End Sub


      Im Prinzip genau das gleiche wie in Lucians Video.
      Was haben wir:
      Eine TaskCompletionSource. Ist so ne Art Dummy Task, der überhaupt nix macht. Man kann ihn aber "fertig" werden lassen.
      Ein Lambda als EventHandler - in dem wird die TCS "fertig" gemacht, indem man ihr das "Sender" Objekt zuweist - was man zueist bleibt einem überlassen und das macht man je nachdem was man halt braucht.

      Wir weisen unseren Buttons 2 und 3 das Lambda als ClickHandler zu. Und dann "warten" wir, welcher von beiden Buttons geklickt wird. Die UI hängt nicht und der ganze Programmablauf bleibt wunderbar linear.

      Async. Man muss es lieben, oder nicht? ;)