asp.net-mvc - 如何在ASP.NET MVC 3中使下载 Action 异步?

标签 asp.net-mvc asp.net-mvc-3 asynchronous

我正在将文件流式传输到客户端以供下载。但是可能发生的是文件的大小可能真的很大(最多几个GB),因此我不想阻止用户单击网页上的其他按钮,该按钮与“下载”使用相同的控制器。通过在互联网上阅读,我发现可以使用“ Async”和“ Completed”后缀使其异步,这是我的代码:

    public void DownloadAsync(string filename, string Id, string docId)
    {
        AsyncManager.OutstandingOperations.Increment();

        // code to get the file from server and send it to client.

        AsyncManager.OutstandingOperations.Decrement();

    }
    public ActionResult DownloadCompleted()
    {
        return RedirectToAction("Index");
    }

     public string OtherAction()
     {
         // code for this action.
     }


当我单击“在网页上下载”时,还单击“ OtherAction”按钮。它仍然同步处理请求。 “ OtherAction”只是向用户返回一个字符串,并且不占用时间,这就是为什么我没有使其异步。

我是否需要在.Increment()和.Decrement()操作之间包含一些代码,以包装代码以将文件下载到“某物”中以启动新线程或类似的东西?我无法弄清楚我在这里还缺少什么。我正在从AsyncController继承控制器。

最佳答案

我认为您在这里缺少一些概念。您有两个部分。

服务器
即使不使用任何异步,每个请求都是异步的,因此用户可以将其他请求发送到服务器而不会被阻塞。

客户端
只要用户开始下载并且不退出浏览器或停止下载,用户就可以继续在同一选项卡或另一个选项卡中进行操作。下载正在完成的请求不会停止。

因此,您无需在服务器中进行任何异步操作。如果下载量很大,我会建议我的用户使用一些下载管理器

关于asp.net-mvc - 如何在ASP.NET MVC 3中使下载 Action 异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198157/

相关文章:

asp.net-mvc-3 - 如何让 IIS Express 使用 64 位第 3 方 DLL 启动 MVC3 Web 应用程序

java - Spring Async,如何在异步任务执行器中启用请求范围

c# 4.5 - 一个主要做数据库插入的 TCP 服务器是否应该在一个任务上启动每个客户端

asp.net-mvc - "Login failed for user ' <用户> '."在 SQL Azure 上的 MVC 5 中使用 DefaultConnection 时

c# - 模型绑定(bind)与史蒂夫桑德森的 BeginCollectionItem

jquery - ASP.Net MVC 3 不显眼的客户端验证不适用于下拉列表

javascript - 从 javascript(无ajax)将字符串参数发送到 Controller (MVC3)

asp.net-mvc - MVC 应用程序中的随机数生成

c# - ASP.NET MVC 中的主页

c# - 等待多个异步调用完成?