38

F# で C# ライブラリを使用しようとしています。ライブラリは async/await を多用します。async { ... }F#のワークフロー内で使用したい。

Async.AwaitTask非同期の C# メソッドで を返すことができるTask<T>ようですが、プレーンを返すメソッドについてはどうTaskでしょうか。

おそらく、これらを変換する、Async<unit>または変換TaskするTask<unit>ためのヘルパーはありAsync.AwaitTaskますか?

4

4 に答える 4

48

ContinueWith を使用できます。

let awaitTask (t: Task) = t.ContinueWith (fun t -> ()) |> Async.AwaitTask

または、タイムアウトが無限の AwaitIAsyncResult:

let awaitTask (t: Task) = t |> Async.AwaitIAsyncResult |> Async.Ignore
于 2011-11-05T20:12:25.217 に答える
18

アップデート:

F# 4.0 の FSharp.Core ライブラリにAsync.AwaitTaskは、プレーンを受け入れるオーバーロードが含まれるようになりましたTask。F# 4.0 を使用している場合は、以下のコードではなく、このコア関数を使用する必要があります。


元の答え:

タスクが例外をスローする可能性がある場合は、おそらくこれも確認する必要があります。例えば

let awaitTask (task : Task) =
    async {
        do! task |> Async.AwaitIAsyncResult |> Async.Ignore
        if task.IsFaulted then raise task.Exception
        return ()
    }
于 2014-11-27T05:53:13.810 に答える
14

アップデート:

F# 4.0 の FSharp.Core ライブラリには、プレーンな Task を受け入れる Async.AwaitTask オーバーロードが含まれるようになりました。F# 4.0 を使用している場合は、以下のコードではなく、このコア関数を使用する必要があります。

元の答え:

関数合成を使用した Ashley の提案は本当に気に入りました。さらに、次のように Async モジュールを拡張できます。

module Async =
    let AwaitTaskVoid : (Task -> Async<unit>) =
        Async.AwaitIAsyncResult >> Async.Ignore

次に、Async.AwaitTask と共に Intellisense に表示されます。次のように使用できます。

do! Task.Delay delay |> Async.AwaitTaskVoid

より良い名前の提案はありますか?

于 2014-05-03T12:30:05.667 に答える