2015-05-04 75 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协议进行通信,该协议不以任何方式保存或传送块大小。客户端永远不会受到服务器写入方式的影响。如果客户想要,他们甚至不能分辨出差异。这是服务器的实现细节。

浏览器“冻结”的原因未知,但它不是您刷新数据的方式。浏览器无需下载任意大小的文件。

请注意,您发布的所有三个代码示例都是有害的,毫无意义或根本不起作用。你需要把它扔掉。寻找其他地方寻找冻结的原因。