如何使 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" 的原因未知,但这不是您刷新数据的方式。浏览器可以轻松下载任意大小的文件。
请注意,您发布的所有三个代码示例要么轻微有害且毫无意义,要么根本不起作用。你需要把这个扔掉。在别处寻找冻结的原因。
如何使用 .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" 的原因未知,但这不是您刷新数据的方式。浏览器可以轻松下载任意大小的文件。
请注意,您发布的所有三个代码示例要么轻微有害且毫无意义,要么根本不起作用。你需要把这个扔掉。在别处寻找冻结的原因。