gpt4 book ai didi

f# - 将 F# 中的热等待任务返回到 C# 框架中的调用方的最合适方法

转载 作者:行者123 更新时间:2023-12-01 12:39:09 25 4
gpt4 key购买 nike

看来是不是经常出现下面的情况,我想知道

  • 什么是最合适和最短的 F# 等价物(例如,没有创建额外的任务,具有相同的 SynchronizationContext 等)?
  • 以下是否有应该修复或改进的地方?

这里 DoAsync 是一个从框架类派生的成员函数,它接受一个参数并返回一个热的、等待的任务给调用者,这是一些框架函数。

在 C# 中:

public async Task DoAsync(int x)
{
if(x == 10)
{
await taskContext.ReturnAsync();
}
}

此处 Async.Ignore 来自 here

在 F# 中:

 member x.DoAsync(int x) =
async {
if x = 10
return! Async.AwaitTask(taskContext.ReturnAsync() |> Async.Ignore)
else
return! Async.AwaitTask(Task.FromResult(0))
} |> Async.StartAsTask :> Task

查看 Tomas 的回答以获得更简单的方法。作为补充说明,在 F# 4.0 中,似乎有非泛型 Task 的重载可用。更多详情,请访问 this Visual F# Tools PR .

最佳答案

使用 Async.AwaitTaskAsync.StartAsTask 是可行的方法。尽管如果您只想返回一个非通用的 Task,您实际上并不需要从 async 返回任何内容:

member x.DoAsync(x:int) =
let work = async {
if x = 10 then
do! taskContext.ReturnAsync() |> Async.Ignore }
Async.StartAsTask(work) :> Task

关于f# - 将 F# 中的热等待任务返回到 C# 框架中的调用方的最合适方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26704985/

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