如何在 F# 中创建 C# 风格的异步成员?

sdg*_*sdh 3 f# c#-to-f#

async在 C# 中,您可以这样注释方法:

class Foo
{
    public async void Bar()  
    {  

    }  
}
Run Code Online (Sandbox Code Playgroud)

这与 F# 不同async;我相信在 F# 中这些称为任务

那么,如何async在 F# 中编写 C# 风格的成员函数呢?

// Not real code
type Foo () = 
  member async this.Bar () = 
    ()
Run Code Online (Sandbox Code Playgroud)

该解决方案必须编译为具有与上述 C# 相同公共接口的 IL。

Tom*_*cek 5

AC#async方法只是一个返回类型值的方法Task<T>。C#编译器使用async关键字来确定是否允许await在代码块内部使用,但据我所知,它在编译后的代码中没有以任何方式表示。

您说“解决方案必须编译为相同的 IL” - 这并不容易实现,因为 F# 以不同的方式实现异步操作。但是,您可以使用如下所示的方法将其编译为具有相同公共接口的 IL:

type Foo () = 
  member this.Bar () = Async.StartAsTask <| async {
    // yadda yadda 
    }
Run Code Online (Sandbox Code Playgroud)

异步操作是使用标准 F# 异步工作流程实现的,因此在幕后,这会创建一个 F# Async<T>,但Async.StartAsTask操作会将其转换为一种Task<T>类型,这正是 C# 所期望的。

编辑:另一种选择是使用TaskBuilder 计算表达式,它允许您使用如下内容直接创建 .NET 任务:

type Foo () = 
  member this.Bar () = task {
    // yadda yadda 
    }
Run Code Online (Sandbox Code Playgroud)