如何使HttpResponse.Flush()异步?

时间:2015-05-04 13:35:47

标签: c# asynchronous flush

如何使用.net 4.0&amp ;;实现对HttpResponse.Flush()方法的asynchrone调用。 VS2013?

我试过委托:

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();

但是每个案例在刷新大文件(1GB +)时似乎都冻结了我的Internet Explorer。有什么想法吗?

问候。

2 个答案:

答案 0 :(得分:3)

无论你的反应是否无关紧要。写入响应对象时使用的块大小也无关紧要。客户端和服务器通过TCP协议进行通信,该协议不以任何方式保留或传递块大小。客户端永远不会受到服务器编写方式的影响。如果想要,客户甚至无法区分。这是服务器的实现细节。

您的浏览器“冻结”的原因尚不清楚,但这不是您刷新数据的方式。浏览器可以轻松下载任意大小的文件。

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

答案 1 :(得分:0)

您创建异步包装器的方法很好。但这里有一些你应该知道的事情。

Response.Flush()强制将完整缓冲区发送到客户端。因此,请尽量避免在客户端上立即发送完整的1 Gig +数据。这可能会使客户端处理这个巨大的缓冲区,并可能最终导致挂起。

不是将巨大的缓冲区一次发送到客户端,而是尝试将流发送到块中并对每个块使用flush,以便客户端在处理请求时不会挂起。

有关使用Response.Flush多次将大块文件以块的形式写入响应,请参阅this KB