假设我有一个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;
}对不起,如果这似乎是一个简单的问题,我是非常新的异步编程!
发布于 2013-09-03 16:57:54
我认为它们本质上是一样的--正如里德所说,第一个直接排队工作,而另一个则创建Task,但创建的Task是相当轻量级的对象(在封面下,这几乎是相同的,任务是使用TaskCompletionSource创建的--您可以使用see the code here)。
如果您控制着F#库,那么我的建议是只公开一个返回Task并隐藏F#异步的方法--这将使来自C#的使用更加方便,并且您将避免所有特殊的F#类型(比如选项)。如果在someWork中有F#函数,那么我会写:
type NiceCSharp =
static member SomeWork() =
Async.StartAsTask(someWork())
static member SomeWork(cancellationToken) =
Async.StartAsTask(someWork(), cancellationToken = cancellationToken)在C#方面,您将看到一个很好的重载方法,它返回Task并与await很好地工作。当然,您可以使用Result同步等待结果,但是开销并不太大--而且您公开了很好的C# API将使F#更容易集成到您的系统中。
https://stackoverflow.com/questions/18597436
复制相似问题