我有两个按钮,我想合并他们的点击事件,然后等待其中任何一个被点击(使用异步),然后根据按下哪个按钮,我想执行不同的操作。
我一直在尝试将Async.AwaitObservable
与Observable.merge
一起使用,但我无法让它工作(它是否存在?)我一直在尝试使用Observable.map
来分配对事件的回报,但我无法得到任何工作。
我想使用匹配表达式根据我点击的按钮执行不同的操作。
故事时间:
这是为了防止我的程序出现变异
我的程序是一个使用Windows窗体和f#的绘图程序
它应该能够绘制两个不同的形状,我不想通过使用mutable来跟踪我正在使用的“工具”,所以相反,我想等待事件并从那里确定。
答案 0 :(得分:1)
由于没有Async.AwaitObservable
方法(至少在我的系统上),使用Async.AwaitEvent
和Event
模块的等效函数而不是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" }