gpt4 book ai didi

c# - Async.RunSynchronously() 与 Async.StartAsTask().Result

转载 作者:太空狗 更新时间:2023-10-29 21:17:51 26 4
gpt4 key购买 nike

假设我有一个 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;
}

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

最佳答案

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

如果您控制了 F# 库,那么我的建议是只公开一个返回 Task 的方法并隐藏 F# async - 这将使 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# 更容易集成到您的系统中。

关于c# - Async.RunSynchronously() 与 Async.StartAsTask().Result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18597436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com