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:
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?
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
- Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Button1.Enabled = False
- Dim tcs As New TaskCompletionSource(Of Object)
- Dim clickhandler = Sub(snd, evt) tcs.TrySetResult(snd)
- Try
- AddHandler Button2.Click, clickhandler
- AddHandler Button3.Click, clickhandler
- MessageBox.Show("Press a button mate!")
- Dim result = Await tcs.Task
- MessageBox.Show("You pressed: " & DirectCast(result, Button).Text)
- Finally
- RemoveHandler Button2.Click, clickhandler
- RemoveHandler Button3.Click, clickhandler
- End Try
- Button1.Enabled = True
- 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?