8

C# で処理する F# 計算があり、それらを同期的に実行したいとします。ボンネットの下の違いは何ですか:

    public static T RunSync<T>(FSharpAsync<T> computation)
    {
        return FSharpAsync.RunSynchronously(computation,
            timeout: FSharpOption<int>.None,
            cancellationToken: FSharpOption<System.Threading.CancellationToken>.None
            );
    }

また

    public static T RunSync<T>(FSharpAsync<T> computation)
    {
        return FSharpAsync.StartAsTask(computation,
            taskCreationOptions: FSharpOption<TaskCreationOptions>.None,
            cancellationToken: FSharpOption<System.Threading.CancellationToken>.None
            ).Result;
    }

これが単純な質問のように思われる場合は申し訳ありませんが、私は非同期プログラミングにまったく慣れていません!

4

1 に答える 1

11

Taskそれらは本質的に同じになると思います-リードが言うように、最初のものは作業を直接キューに入れ、もう一方はTask. TaskCompletionSource-ここでコードを見ることができます)。

F# ライブラリを管理している場合はTask、F# 非同期を返し、非表示にするメソッドのみを公開することをお勧めします。これにより、C# からの使用がはるかに便利になり、すべての特別な F# 型 (オプションなど) を回避できます。 )。someWorkF# に関数がある場合は、次のように記述します。

type NiceCSharp = 
  static member SomeWork() =
    Async.StartAsTask(someWork())
  static member SomeWork(cancellationToken) =
    Async.StartAsTask(someWork(), cancellationToken = cancellationToken)

TaskC# 側では、 を返し、適切に動作するオーバーロードされたメソッドが表示されますawait。もちろん、 を使用して同期的に結果を待つこともできますResultが、オーバーヘッドはそれほど大きくありません。また、優れた C# API を公開しているという事実により、F# をシステムに簡単に統合できます。

于 2013-09-03T16:57:54.357 に答える