如果我之后直接使用`Response.End()`,那么`Response.Flush()`是否有意义?

时间:2012-08-10 01:11:52

标签: c# asp.net

我通过刷新和结束来结束我对客户端的传输。如下面的代码所示。

Response.Flush();
Response.End();

然而,它只是让我Response.End()将缓冲的内容刷新到客户端。那么在序列中使用两者是否有任何意义?

1 个答案:

答案 0 :(得分:4)

简而言之,不,但两者之间存在重要差异:

在完成所有处理(即禁用响应缓冲)之前,

Response.Flush() 对于写入部分响应非常有用。 Flush()之后的任何代码都将继续执行,任何先前的Response.Write()都将刷新到客户端。

Response.End() 更残酷......它不仅会中止当前线程,而且会这样做,它会抛出一个ThreadAbort异常并终止当前请求。除非你正确处理异常,否则Response.End()之后的任何代码都永远不会看到光明。

正如您所指出的,End()将刷新您的缓冲内容。在某些情况下,End()实际上会在内部调用Flush(),具体来说,如果上下文不可取消:

public void End()
{
    if (this._context.IsInCancellablePeriod)
    {
        InternalSecurityPermissions.ControlThread.Assert();
        Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
    }
    else if (!this._flushing)
    {
        this.Flush();
        this._ended = true;
        if (this._context.ApplicationInstance != null)
        {
            this._context.ApplicationInstance.CompleteRequest();
        }
    }
}