Warten auf ein Ereignis von mehreren Ereignissen gleichzeitig in F #

7

In F # weiß ich, wie man asynchron für ein Ereignis mit Async.AwaitEvent : %Vor%

Angenommen, ich möchte entweder auf die MouseMove oder das KeyDown -Ereignis. Ich hätte gerne so etwas:

%Vor%

Diese Funktion existiert nicht, gibt es aber eine andere Möglichkeit?

    
Ronald Wildenberg 13.09.2010, 15:28
quelle

4 Antworten

11
%Vor%

BEARBEITEN: eine andere Version, die Originaltypen beibehält

%Vor%

EDIT 2 : laut Kommentaren von Tomas Petricek

%Vor%

AwaitObservable Grundelement kann hier ('Reactive Demos in Silverlight 'von Tomas Petricek).

    
desco 13.09.2010, 16:01
quelle
12

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).

    
Tomas Petricek 13.09.2010 21:54
quelle
4

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%     
gradbot 13.09.2010 17:39
quelle
0

Sie können eine Kombination aus Event.map und Event.merge verwenden:

%Vor%

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.

    
kvb 13.09.2010 15:56
quelle

Tags und Links