在 F# 中同时等待多个事件中的任何一个事件

2023-11-27

在 F# 中,我知道如何使用异步等待一个事件Async.AwaitEvent:

let test = async {
  let! move = Async.AwaitEvent(form.MouseMove)
  ...handle move... }

假设我想等待MouseMove or the KeyDown事件。我想要这样的东西:

let! moveOrKeyDown = Async.AwaitEvent(form.MouseMove, form.KeyDown)

这个功能不存在,但是有其他方法可以做到这一点吗?


我使用了您在示例中使用的方法的实现谈论反应式编程我在伦敦拥有的(页面底部有一个下载链接)。如果您对这个主题感兴趣,您可能会发现这次演讲也很有用:-)。

我正在使用的版本需要IObservable代替IEvent(所以该方法的名称是AwaitObservable)。有一些严重内存泄漏使用时Event.merge(以及来自的其他组合器Event模块)连同AwaitEvent,所以你应该使用Observable.merge等等以及AwaitObservable反而。

问题描述的更详细here(参见第 3 节以获得清晰的示例)。简而言之 - 当您使用Event.merge,它将一个处理程序附加到源事件(例如MouseDown),但在您完成等待后,它不会删除处理程序AwaitEvent,因此该事件永远不会被删除 - 如果您在使用异步工作流程编码的循环中继续等待,您将不断添加新的处理程序(在运行时不执行任何操作)。

一个简单的正确解决方案(基于什么desco发布)看起来像这样:

let rec loop () = async {
  let e1 = f.KeyDown |> Observable.map Choice1Of2
  let e2 = f.MouseMove |> Observable.map Choice2Of2
  let! evt = Observable.merge e1 e2 |> Async.AwaitObservable
  // ...
  return! loop() } // Continue looping

顺便说一句:您可能还想看看本文(基于我书中的第 16 章)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 F# 中同时等待多个事件中的任何一个事件 的相关文章

随机推荐

  • 一起使用 SQL LIKE 和 IN

    有没有办法同时使用LIKE和IN 我想实现这样的目标 SELECT FROM tablename WHERE column IN M510 M615 M515 M612 所以基本上我希望能够将列与一堆不同的字符串相匹配 是否有另一种方法可以
  • OS X 的默认命令如何访问沙盒应用程序的首选项?

    我正在编写一个首选项编辑器工具 请参阅http www tempel org PrefsEditor 它实际上是 GUI 版本defaults命令 不过 我在读取 更不用说编写 随机沙盒应用程序的偏好时遇到了困难 例如 当我尝试获取地图应用
  • Apache POI 5 和 XMLBeans 类路径问题

    我尝试在下面的帖子中回答 但我没有 声誉 也确实没有时间去寻找 10 个问题来回答 运行时异常 POI 5 和 xmlbeans 对于 WebLogic 服务器中的 POI 5 和 XMLBeans 4 或 5 存在类加载器问题 它将尝试使
  • 在 Oracle DB 中将 pandas(字符串/对象)列保存为 VARCHAR 而不是 CLOB(默认行为)

    我正在尝试将数据帧传输到 Oracle 数据库 但传输时间太长 因为变量的数据类型显示为clob在甲骨文中 但是我相信如果我将数据类型转换为clob到字符串9 digits with 填充0 不会花那么多时间 数据是 product 000
  • 我们什么时候应该将 .then 与 Protractor Promise 一起使用?

    我对量角器有很多不稳定的地方 我确信有些东西我不明白 有时我需要在继续之前单击按钮时使用 then 有时它没有任何影响 我不应该使用 then 或测试失败 我想知道在 Protractor 中测试时何时应该使用 then 回调 例子 cre
  • 树枝中“do”标签的用途是什么

    我看过关于树枝的文档do标签 但我不明白它的用途 有用 The docs说如下 do 标签的工作方式与正则变量表达式 只是它不打印任何内容 并展示一个例子 do 1 2 这个标签到底要解决什么 好问题 我发现GitHub 上的链接 指向何时
  • F# 删除函数处理程序

    因此 我有一个想要在事件触发器上执行的函数 但我想稍后将其删除 我为此做什么 我知道 F 事件有Add添加函数作为处理程序的方法 但您无法删除此函数 我明白 但我根本找不到如何创建任何委托 嗯 有is the type Foo delega
  • 如何在 Eclipse 中升级到 GWT 2.5

    我正在使用 GWT 2 4 和 Eclipse Juno GWT 是按照以下说明安装的https developers google com web toolkit usingeclipse 我想尝试 GWT 2 5 如何从 GWT 2 4
  • 架构armv7的未定义符号:cocoaPods iPhone 5

    仅当我尝试在 iPhone 5 上构建和运行时 我才会收到此错误 它在 iPhone 6 或更高版本上运行良好 这些都是产生错误的 cocoaPods 我已经运行了 pod install pod update 清除了 pod 并重新开始
  • cURL 中的数据二进制参数

    我必须通过 php 中的 cURL 发送数据二进制参数 这是命令 curl D u user password X PUT H Content Type text plain data binary data id 2010 10 01 1
  • Java 8 DateTimeFormatter 与可选部分

    我有一个代表日期 有或没有时间 的字符串 例如13 12 2017 or 13 12 2017 15 39 51 所以我尝试将 java 8 DateTimeFormatter 与可选部分一起使用 该代码有效 LocalDateTime l
  • 为跨源请求设置cookie

    如何跨域共享cookies 更具体地说 如何使用Set Cookie标题与标题相结合Access Control Allow Origin 这是我的情况的解释 我正在尝试为正在运行的 API 设置 cookielocalhost 4000在
  • MySQL Select:其中时间大于且小于时间

    我有一个接受两个时间参数的函数 start time end time每个参数在 php 中定义为时间 start time date H i s strtotime start gt like 06 12 44 end time date
  • SQL Server 替换、删除特定字符后的所有内容

    我的数据看起来像 ID MyText 1 some text some more text 2 text again even more text 如何更新 我的文本 以删除分号之后的所有内容并包括分号 因此我只剩下以下内容 ID MyTe
  • PrimeFaces dataTable:如何捕获每页行数事件?

    我创建了一个 PrimeFaces 数据表
  • 在有限空间中找到中位数的概率

    这是 StackOverflow 的衍生产品question 假设你有一个固定的号码k存储位置和两个柜台的空间 您将收到n随机顺序的项目 所有排列n项的可能性相同 收到每件物品后 您可以将其存放在其中一个k位置 丢弃先前存储的值之一 或丢弃
  • 导入错误:“没有命名的模块”。但模块已经安装在 dist-packages 中

    我正在使用 python2 7 并尝试导入模块 例如psycopg2 但是当我尝试导入模块时出现以下错误 import psycopg2 ImportError No module named psycopg2 当我尝试时pip要安装该模块
  • 已超出传入消息的最大消息大小配额 (65536)

    我对 WCF 服务有以下配置 即使我增加了 maxReceivedMessageSize 服务仍然会抛出错误 已超出传入消息的最大消息大小配额 65536 要增加配额 请在适当的绑定元素上使用 MaxReceivedMessageSize
  • matlab 图中的自定义 x 轴值

    目前 当我绘制 9 x 6 数组时 该图的 x 轴仅为 1 2 3 到 9 Y 轴显示正确的值 我希望自定义 x 轴值 而不是 1 到 9 他们应该是 100 200 400 1000 2000 5000 10000 20000 50000
  • 在 F# 中同时等待多个事件中的任何一个事件

    在 F 中 我知道如何使用异步等待一个事件Async AwaitEvent let test async let move Async AwaitEvent form MouseMove handle move 假设我想等待MouseMov