我正在将文件流式传输到客户端以供下载。但是可能发生的是文件的大小可能真的很大(最多几个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/