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

标签 f# c#-to-f#

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

  • 什么是最合适和最短的 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/

相关文章:

oauth - AspNet Core 重定向循环中的 Giraffe + GitHub OAuth 流程

c# - 是否可以从 F# 使用 LINQ 以及如何使用?

c# - 在 F# 中编写此 AWS C# 代码片段

c# - 如何声明一个以元组列表作为参数的 f# 方法?

.net - 这是 F# 结构化 printf 错误吗?

json - F# JSON Type Provider,不序列化空值

具有单子(monad)绑定(bind)的 F# 尾递归

F# Canopy 关闭弹出窗口

F# 如何在控制台应用程序中创建一个循环,循环执行一个方法,直到按下某个键为止

c# - 设计或代码模式以从函数返回多个可选值