asp.net-mvc - F# 中的异步 Controller 操作

标签 asp.net-mvc asynchronous f#

使用 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/

相关文章:

swift - 如何在异步 api 调用后执行同步 api 调用

javascript - 提交ajax请求时,如何暂时 "put the original request on hold"直到满足条件?

.net - 是否可以定义相互依赖并在单独的文件中定义的类型?

csv - 在 F# 中向 CsvProvider 类型添加新成员

silverlight - 添加图像 F#

javascript - 如何在 asp.net 模型中调用 vanilla js 中的服务

c# - 如何使用 DropDownList 绑定(bind)到 WebGrid razor asp net mvc 4 中的模型?

asp.net-mvc - 向 asp mvc 表单添加与字段无关的错误

c# - ASP.NET MVC 下拉列表

multithreading - 异步与多线程 - 有区别吗?