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)
它给出了异步的外观,如果从计算表达式返回,最终会得到正确的类型,因此我谨慎地将此标记为成功.
令我怀疑的是,我找不到其他人尝试这个的例子,所以我很欣赏一些外部观点.
归档时间: |
|
查看次数: |
379 次 |
最近记录: |