如何使 HttpResponse.Flush() 异步?

How to make HttpResponse.Flush() async?

如何使用 .net 4.0 和 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();

但是在刷新大文件 (1GB+) 时,每种情况似乎都会冻结我的 Internet Explorer。有什么想法吗?

此致。

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

Response.Flush() 强制将完整的缓冲区发送给客户端。所以尽量避免在客户端一次发送完整的 1 Gig+ 数据。这可能会让客户端处理那个巨大的缓冲区,并可能以挂起告终。

与其将巨大的缓冲区发送到客户端一次,不如尝试将流发送到块中并对每个块使用刷新,这样客户端就不会在处理您的请求期间挂起。

请参阅 this KB 多次使用 Response.Flush 将大文件分块写入响应。

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

您的浏览器 "freezes" 的原因未知,但这不是您刷新数据的方式。浏览器可以轻松下载任意大小的文件。

请注意,您发布的所有三个代码示例要么轻微有害且毫无意义,要么根本不起作用。你需要把这个扔掉。在别处寻找冻结的原因。