如何使用.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。有什么想法吗?
问候。
答案 0 :(得分:3)
无论你的反应是否无关紧要。写入响应对象时使用的块大小也无关紧要。客户端和服务器通过TCP协议进行通信,该协议不以任何方式保留或传递块大小。客户端永远不会受到服务器编写方式的影响。如果想要,客户甚至无法区分。这是服务器的实现细节。
您的浏览器“冻结”的原因尚不清楚,但这不是您刷新数据的方式。浏览器可以轻松下载任意大小的文件。
请注意,您发布的所有三个代码示例都是有害的,没有意义或根本不起作用。你需要扔掉它。寻找其他地方寻找冻结的原因。
答案 1 :(得分:0)
您创建异步包装器的方法很好。但这里有一些你应该知道的事情。
Response.Flush()强制将完整缓冲区发送到客户端。因此,请尽量避免在客户端上立即发送完整的1 Gig +数据。这可能会使客户端处理这个巨大的缓冲区,并可能最终导致挂起。
不是将巨大的缓冲区一次发送到客户端,而是尝试将流发送到块中并对每个块使用flush,以便客户端在处理请求时不会挂起。
有关使用Response.Flush多次将大块文件以块的形式写入响应,请参阅this KB。