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

时间:2013-09-03 16:43:57

标签: c# asynchronous f# 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
            );
    }

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

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

1 个答案:

答案 0 :(得分:8)

我认为它们基本上是相同的 - 正如Reed所说,第一个直接排队工作而另一个创建Task,但创建的Task是相当轻量级的对象(在封面,这几乎相同,任务是使用TaskCompletionSource创建的 - 您可以see the code here)。

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

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

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