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