首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async.RunSynchronously() vs Async.StartAsTask().Result

Async.RunSynchronously() vs Async.StartAsTask().Result
EN

Stack Overflow用户
提问于 2013-09-03 16:43:56
回答 1查看 3.4K关注 0票数 8

假设我有一个F#计算要在C#中处理,我想让它们同步运行。在引擎盖下面有什么区别:

代码语言:javascript
复制
    public static T RunSync<T>(FSharpAsync<T> computation)
    {
        return FSharpAsync.RunSynchronously(computation,
            timeout: FSharpOption<int>.None,
            cancellationToken: FSharpOption<System.Threading.CancellationToken>.None
            );
    }

代码语言:javascript
复制
    public static T RunSync<T>(FSharpAsync<T> computation)
    {
        return FSharpAsync.StartAsTask(computation,
            taskCreationOptions: FSharpOption<TaskCreationOptions>.None,
            cancellationToken: FSharpOption<System.Threading.CancellationToken>.None
            ).Result;
    }

对不起,如果这似乎是一个简单的问题,我是非常新的异步编程!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 16:57:54

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

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

代码语言:javascript
复制
type NiceCSharp = 
  static member SomeWork() =
    Async.StartAsTask(someWork())
  static member SomeWork(cancellationToken) =
    Async.StartAsTask(someWork(), cancellationToken = cancellationToken)

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18597436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档