我试图在F#中创建下面的示例类(取自此处).
public class LoggingMiddleware
{
private AppFunc next;
public LoggingMiddleware(Func<IDictionary<string, object>, Task> next)
{
this.next = next;
}
public async Task Invoke(IDictionary<string, object> environment)
{
Console.WriteLine("Begin Request");
await next.Invoke(environment);
Console.WriteLine("End Request");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我正在努力在典型的.NET类型和典型的F#类型之间进行转换,并使用F#async工作流来实现C#await所发生的事情.
F#异步工作流和.Net任务的最大(当前)问题是没有直接类比Task没有返回类型的问题.
从这个问题,我将使用此函数绑定来等待没有返回值的任务:
let awaitTask = Async.AwaitIAsyncResult >> Async.Ignore
Run Code Online (Sandbox Code Playgroud)
有了它,您可以直接将您的示例类翻译为:
type FSharpMiddleware(next: Func<IDictionary<string,obj>, Task>) =
member this.Invoke (environment: IDictionary<string,obj>) : Task =
async {
printfn "Begin Request"
do!
awaitTask <| next.Invoke environment
printfn "End Request"
} |> Async.StartAsTask :> Task
Run Code Online (Sandbox Code Playgroud)