In F # weiß ich, wie man asynchron für ein Ereignis mit Angenommen, ich möchte entweder auf die Diese Funktion existiert nicht, gibt es aber eine andere Möglichkeit? Async.AwaitEvent
: MouseMove
oder das KeyDown
-Ereignis. Ich hätte gerne so etwas:
Ich habe eine Implementierung einer Methode verwendet, die Sie in Ihrer Probe im reaktiven Programmieren verwenden , dass ich hatte in London (es gibt einen Download-Link am Ende der Seite). Wenn Sie sich für dieses Thema interessieren, können Sie das Gespräch auch nützlich finden: -).
Die von mir verwendete Version nimmt IObservable
anstelle von IEvent
(der Name der Methode ist also AwaitObservable
). Es gibt einige schwerwiegende Speicherlecks bei Verwendung von Event.merge
(und anderen Kombinatoren aus dem Event
-Modul) zusammen mit AwaitEvent
, also sollten Sie stattdessen Observable.merge
usw. und AwaitObservable
verwenden.
Das Problem wird hier genauer beschrieben (siehe Abschnitt 3 für ein klares Beispiel). . Kurz gesagt: Wenn Sie Event.merge
verwenden, fügt es dem Quellenereignis einen Handler hinzu (zB MouseDown
), entfernt jedoch den Handler nicht, nachdem Sie mit AwaitEvent
gewartet haben. Das Ereignis wird also nie entfernt - wenn Sie es behalten Wenn Sie in einer Schleife warten, die mit einem asynchronen Workflow codiert ist, fügen Sie neue Handler hinzu (die beim Ausführen nichts tun).
Eine einfache richtige Lösung (basierend auf dem, was desco gepostet wurde) würde so aussehen:
%Vor%Übrigens: Vielleicht möchten Sie auch dieser Artikel (basierend auf Kapitel 16 aus meinem Buch).
Um zu verstehen, was vor sich geht, habe ich den Quellcode nach Event.map, Event.merge und Choice gesucht.
%Vor%Dies bedeutet, dass unsere Lösung 3 neue Ereignisse erstellt.
%Vor%Wir könnten dies auf ein Ereignis reduzieren, indem wir eine eng gekoppelte Version dieses Bibliothekscodes erstellen.
%Vor%Und hier ist unser neuer Code.
%Vor% Sie können eine Kombination aus Event.map
und Event.merge
verwenden:
Dann können Sie Async.AwaitEvent
mit diesem neuen Ereignis verwenden. Wenn MouseMove
und KeyDown
denselben Typ hätten, könnten Sie den Schritt Event.map
überspringen und einfach direkt zusammenführen.
BEARBEITEN
Aber Tomas weist darauf hin, dass Sie die Observable
Kombinatoren vor den Event
Einsen verwenden sollten.
Tags und Links f# asynchronous events