F#计算表达式和任务并行库

Ric*_*ban 5 f# asynchronous computation-expression async-await

我最近一直在使用F#工作,最近用C#web项目和F#类库编写了一个MVC应用程序,后者包含大部分代码.

我想使用MVC更高版本的异步控制器功能,你可以返回一个Task<ActionResult>.我正在使用F#异步计算表达式编写我的代码,但是不得不经常使用Async.AwaitTask和从Async <'T>转换为Task <'T> StartAsTask.

由于我当时正在学习计算表达式,我想"必须有一种方法可以使用任务和异步的计算表达式来实现更好的F#/ C#interop",所以我有一个去:

type TaskBuilder () =
    member this.ReturnFrom task = task
    member this.Return value = Task.FromResult value
    member this.Bind (task : Task<'a>, continuation: 'a -> Task<'b>) =
        task.ContinueWith(fun (t : _ Task) ->
            (t.Result |> continuation).Result)
    member this.Zero () = Task.FromResult ()
Run Code Online (Sandbox Code Playgroud)

这似乎有效; 运行以下代码:

let task = TaskBuilder()

task {
    let! data = (new WebClient()).DownloadStringTaskAsync(Uri "http://www.google.com")

    printfn "Downloaded from Google: %A" (data.Length)
}
|> ignore

task {
    let! data = (new WebClient()).DownloadStringTaskAsync(Uri "http://www.bing.com")

    printfn "Downloaded from Bing: %A" (data.Length)
}
|> ignore

printfn "Hello world"
Run Code Online (Sandbox Code Playgroud)

得出结果:

Here
Downloaded from Bing: 39121
Downloaded from Google: 46005
Run Code Online (Sandbox Code Playgroud)

它给出了异步的外观,如果从计算表达式返回,最终会得到正确的类型,因此我谨慎地将此标记为成功.

令我怀疑的是,我找不到其他人尝试这个的例子,所以我很欣赏一些外部观点.

  1. 这有用吗?
  2. 这首先是一个好主意吗?