假设我有一个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;
}
很抱歉,如果这看起来像一个简单的问题,我对异步编程很新!
答案 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#。