我正在尝试在F#中创建下面的示例类(取自here)。
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");
}
}
但是,我在使用典型的.NET类型和典型的F#类型进行转换以及使用F#异步工作流来实现C#等待发生的事情时都很困难。
答案 0 :(得分:6)
F#异步工作流和.Net任务的最大(当前)问题是没有直接类比没有返回类型的Task
。
从this question开始,我将使用此函数绑定来等待没有返回值的任务:
let awaitTask = Async.AwaitIAsyncResult >> Async.Ignore
有了这个,您可以直接将您的示例类翻译为:
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