Async.RunSynchronously()vs Async.StartAsTask().结果

Gyr*_*ien 6 c# f# asynchronous c#-to-f#

假设我有一个F#计算来处理C#,我想让它们同步运行.引擎盖之间的区别是什么:

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

要么

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

对不起,如果这看起来像一个简单的问题,我对异步编程很新!

Tom*_*cek 9

我认为它们基本上是相同的 - 正如Reed所说,第一个直接排队工作而另一个创建一个Task,但创建的Task是相当轻量级的对象(在封面下,这几乎是相同的,任务是使用TaskCompletionSource- 你可以在这里看到代码).

如果您控制F#库,那么我的建议是只公开一个返回Task并隐藏F#异步的方法 - 这将使C#的使用更加方便,您将避免使用所有特殊的F#类型(如选项) ).如果你someWork在F#中有功能,那么我会写:

type NiceCSharp = 
  static member SomeWork() =
    Async.StartAsTask(someWork())
  static member SomeWork(cancellationToken) =
    Async.StartAsTask(someWork(), cancellationToken = cancellationToken)
Run Code Online (Sandbox Code Playgroud)

在C#方面,您将看到一个很好的重载方法,它返回Task并且运行良好await.当然,您可以使用同步等待结果Result,但开销不是太大 - 而且您公开了不错的C#API这一事实将使您更容易在系统中集成F#.