3

私は非同期的にいくつかのことを行う関数を持っていますが、非同期を公開せず、代わりに終了時に結果でコールバックを呼び出します。私はそれを非同期に変えたいと思っていて、このコードを思いつきましたが、まったく正しくないようです。それを行うより良い方法はありますか?

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

このシナリオで Event の代わりに Observable または ManualResetEvent を使用する利点はありますか?

4

1 に答える 1

4

この場合の慣用的な解決策は、次を使用することだと思いますAsync.FromContinuations

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

このFromContinuations関数を使用すると、例外 (例外が発生した場合に呼び出すecont) またはキャンセル (非同期計算を作成する基本的な方法と見なすことができます) を処理することもできます。

そうは言っても、イベントを使用することに問題はないと思います。イベントを含むコードは、ほぼ同じロジック (と思います) を実装していますが、より複雑な方法で実装されています。

于 2013-03-21T14:52:58.517 に答える