3

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

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

在这种情况下使用 Observable 或 ManualResetEvent 代替 Event 有什么好处?

4

1 回答 1

4

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

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

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

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

于 2013-03-21T14:52:58.517 回答