2015-05-04 77 views
3

如何使用.net 4.0實現對HttpResponse.Flush()方法的異步調用& VS2013?如何使HttpResponse.Flush()異步?

我想代表:

var caller = new AsyncFlush(context.Response.Flush); 
var result1 = caller.BeginInvoke(null, null); 
caller.EndInvoke(result1); 

然後任務:

Task.Factory.StartNew(() => context.Response.Flush()).Start(); 

終於螺紋:

new Thread(new ThreadStart(() => context.Response.Flush()).Start(); 

但每一種情況下似乎沖洗拉爾文件時凍結我的Internet Explorer(1GB + )。任何想法?

問候。

+0

我正在使用C#;) – Giglagla

+0

'BackgroundWorker'可能嗎? – Pseudonym

+0

你能更具體地說明你在哪裏使用這段代碼? Asp.net的形式/ MVC/WebApi /處理程序等,以便它可以得到精確回答。 – vendettamit

回答

0

您的創建異步包裝的方法很好。但是這裏有幾件事你應該知道。

Response.Flush()強制發送給客戶端的完整緩衝區。因此,儘量避免一次性在客戶端上發送完整的1Gig +數據。這可能會引起客戶端處理巨大的緩衝區,並可能導致掛起。

而不是發送巨大的緩衝區一次到客戶端嘗試發送流成塊,並使用刷新每個塊,以便客戶端不會在處理您的請求期間掛起。

請參閱this KB用於使用Response.Flush多次將大文件寫入塊。

+0

鑑於此答案已被接受,我想補充以下內容:此處提供的有關客戶端的所有假設都是錯誤的。客戶端甚至無法檢測用於寫入數據的塊大小。查看我的答案以獲得更正確的圖片。我甚至不確定知識庫文章談論什麼。這是無稽之談,甚至沒有說它解決了什麼問題。它遺漏了客戶的名字。它適用於.NET 1.0。 – usr

3

無論你是否沖洗響應無關緊要。寫入響應對象時使用的塊大小也無關緊要。客戶端和服務器通過TCP協議進行通信,該協議不以任何方式保存或傳送塊大小。客戶端永遠不會受到服務器寫入方式的影響。如果客戶想要,他們甚至不能分辨出差異。這是服務器的實現細節。

瀏覽器「凍結」的原因未知,但它不是您刷新數據的方式。瀏覽器無需下載任意大小的文件。

請注意,您發佈的所有三個代碼示例都是有害的,毫無意義或根本不起作用。你需要把它扔掉。尋找其他地方尋找凍結的原因。