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。
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)