2013-04-24 39 views
3

我正在將文件流式傳輸到客戶端進行下載。但它可能發生的文件大小可能真的很大(高達幾GB),因此我不想阻止用戶點擊網頁上的其他按鈕與下載相同的控制器。從閱讀互聯網上,我發現,我可以把它異步使用「異步」和「完成」後綴,這是我的代碼:如何在asp.net mvc 3中使下載動作異步?

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()操作之間包含一些代碼來包裝代碼以下載「something」內的文件以啓動一個新線程或類似的東西?我無法弄清楚我在這裏失去的其他作品。我從AsyncController繼承控制器。

+0

你需要使用jQuery的AJAX功能和發送陣列叮咬到服務器, 在那裏你可以對其進行處理和發送類似json的客戶 – 2013-07-21 23:14:15

+0

的原因,可能看起來是同步的,因爲大多數瀏覽器只能同時打開兩個連接。 – 2013-08-26 20:26:32

回答

2

我認爲你錯過了這裏的一些概念。你有兩個部分。

服務器
每個請求是異步的,即使沒有使用任何異步的,因此用戶可以發送其它請求給服務器,而不會被阻擋。

客戶
只要用戶啓動下載,不退出瀏覽器或停止下載,用戶可以保持在同一個標​​籤或在另一個做操作。下載完成的請求不會停止。

所以,你不需要在服務器上做任何異步。我只是推薦我的用戶使用一些下載管理器,如果下載的是幾個GB重