使用 C# - ASP.NET MVC 4,我可以定义一个异步 Controller 操作,如:
public async Task<ActionResult> IndexWorks()
{
var data = await DownloadAsync("http://stackoverflow.com");
return Content(data);
}
有没有办法使用 F# 做类似的事情?
我知道我可以使用
AsyncManager
方法。我也知道@Tomas Petricek 做了一个非常整洁的 AsyncActionBuilder
,但与 C# 方法相比,它只是感觉像很多样板。
最佳答案
async/await 使用 Tasks,因此您需要在 Task 对象和 F# Async 对象之间来回转换。要将 Task 转换为 Async,请使用 Async.AwaitTask
.做相反的使用 Async.StartAsTask
.你的例子变成:
member x.IndexWorks() =
async {
let! data = Async.AwaitTask (DownloadAsync "http://stackoverflow.com")
return x.Content(data)
} |> Async.StartAsTask
或者,不要使用
async
计算表达式,您可以使用适用于开箱即用的任务的计算表达式。 FSharpx 中有一个:let task = FSharpx.Task.TaskBuilder()
(...)
member x.IndexWorks() = task {
let! data = DownloadAsync "http://stackoverflow.com"
return x.Content(data)
}
关于asp.net-mvc - F# 中的异步 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18115812/