合并两个事件,检测引发的事件

时间:2014-01-11 16:05:50

标签: events f#

我有两个按钮,我想合并他们的点击事件,然后等待其中任何一个被点击(使用异步),然后根据按下哪个按钮,我想执行不同的操作。

我一直在尝试将Async.AwaitObservableObservable.merge一起使用,但我无法让它工作(它是否存在?)我一直在尝试使用Observable.map来分配对事件的回报,但我无法得到任何工作。

我想使用匹配表达式根据我点击的按钮执行不同的操作。

故事时间:
这是为了防止我的程序出现变异 我的程序是一个使用Windows窗体和f#的绘图程序 它应该能够绘制两个不同的形状,我不想通过使用mutable来跟踪我正在使用的“工具”,所以相反,我想等待事件并从那里确定。

1 个答案:

答案 0 :(得分:1)

由于没有Async.AwaitObservable方法(至少在我的系统上),使用Async.AwaitEventEvent模块的等效函数而不是Observable应该有效。

type WhichButton = B0Clicked | B1Clicked

let clicks =
    (   b0.Click |> Event.map (fun _ -> B0Clicked) ,
        b1.Click |> Event.map (fun _ -> B1Clicked) )
    ||> Event.merge 

let waitForClicks() = async{
    while true do
        let! clicked = Async.AwaitEvent clicks
        match clicked with
        | B0Clicked -> printfn "Button 0"
        | B1Clicked -> printfn "Button 1" }