3

我正在将文件流式传输到客户端以供下载。但是文件大小可能非常大(最多几 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 继承控制器。

4

1 回答 1

2

我认为您在这里遗漏了一些概念。你有两个部分。

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

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

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

于 2013-08-26T17:38:46.497 回答