httpResponse.end()的缓冲输出?

4
在.NET中,httpResponse.end()的描述是“将当前所有缓冲输出发送到客户端”。有人能解释一下这是什么意思吗?具体来说,“缓冲输出”是什么?我之所以问是因为我被要求用HttpContext.Current.ApplicationInstance.CompleteRequest()替换httpResponse.end。当涉及到文件时,这会导致问题,所以我猜这个短语与此有关。

导致问题的原因是什么,出现了哪些类型的问题? - Andrew Savinykh
如果你在MSDN或Google上搜索,可能会得到更快的响应,因为你可以阅读每个术语的含义和区别。 - MethodMan
当你向流中写入数据时,通常不会立即传输。它会进入一个缓冲区,保存待发送的数据。当流被刷新时,缓冲区中的数据被发送并清空。实际上,这意味着正在刷新响应。 - Jeff Mercado
@zespri 我不是100%确定,但大致上是将图表中的一些数据转换为Excel。整个过程非常复杂,我仍在尝试调试它。但是,一旦我删除了“httpResponse.end”,Excel文件就会生成错误。 - Art F
@zespri httpResponse.End会自动引发异常,虽然已经处理了,但会影响性能。我的一些经理想看看更改这个是否会提高性能。 - Art F
显示剩余2条评论
3个回答

2
不是在你写入输出流的每个位元组时立即发送所有信息,而是将您编写的内容存储在内存中,直到它具有“足够”数据,认为值得花费时间将其发送到客户端。缓冲区的大小可以因上下文和缓冲数据的原因而大幅变化。要“刷新”缓冲区是处理缓冲区中的所有未决数据(在本例中,处理意味着将其通过网络发送到客户端)。这就是您的情况下end所做的。
缓冲可以出于许多原因进行,但通常是出于性能考虑。如果您为流编写的每个字符或(在许多情况下)传递给Write的每个字符串都发送网络数据包,则会非常浪费时间。通过发送较少、更大的信息数据包,应用程序将更快地执行。

1
缓冲输出指的是任何准备好发送给客户端但尚未发送到客户端的输出。

1
缓冲输出是指程序已经生成的输出,但尚未转发到其预期目的地。
在I/O操作中经常使用缓冲以避免发送/写入小量数据的成本:系统将输出收集到称为“缓冲区”的内存区域中,并在达到一定大小时才发送/写入数据,而不是在写入时立即将输出传递到其目的地。
缓冲数据到达其目的地有两种方式:
1. 输出量达到某个阈值,或者 2. 显式调用某些方法来“刷新”缓冲区。
例如,httpResponse.end就是这样一种方法:它通过发送到客户端所有你已经编写的内容来清空缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接