events - 异步和事件

标签 events asynchronous f#

我有一个函数可以异步执行一些操作,但不会公开异步,而是会在完成时调用带有结果的回调。我想将其变成异步,并提出了这段代码,但似乎不太正确。有更好的方法吗?

async { 
    let ev = Event<_>()
    someAsyncExternalCodeThatWillCallTheCallbackWhenDone(fun value -> ev.Trigger value)
    let! value = Async.AwaitEvent(ev.Publish)
    return value 
}

在这种情况下使用 Observable 或 ManualResetEvent 而不是 Event 有什么优势吗?

最佳答案

我认为这种情况下惯用的解决方案是使用Async.FromContinuations:

Async.FromContinuations(fun (cont, econt, ccont) ->
  someAsyncExternalCodeThatWillCallTheCallbackWhenDone(cont))

FromContinuations 函数还可以让您处理异常(如果发生异常,则调用 econt)或取消(您可以将其视为基本 创建异步计算的方法)。

也就是说,我不认为使用事件有什么问题。带有事件的代码实现了几乎相同的逻辑(我认为),但以更复杂的方式。

关于events - 异步和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550614/

相关文章:

c#,ListBox中是否有OnChange事件?

multithreading - 基本的QT事件处理/线程问题?

c++ - MFC 串行通信

javascript - 触发 iframe 内 textarea 的 'change' 事件

ios - 粘性 UICollectionView header F#

ios - 为 iOS 发送多个 HTTP Post 请求的最快方法?

javascript - 如何从异步调用返回响应?

javascript - async.each 无法在设置后设置 header

algorithm - F# 数学库 - 计算中位数

recursion - 在 F# 中使用不可变记录的状态机