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)
对不起,如果这看起来像一个简单的问题,我对异步编程很新!
我认为它们基本上是相同的 - 正如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#.
| 归档时间: |
|
| 查看次数: |
2556 次 |
| 最近记录: |