C# 如果直接在后面使用`Response.End()`则`Response.Flush()`有意义吗?

C# 如果直接在后面使用`Response.End()`则`Response.Flush()`有意义吗?,c#,asp.net,C#,Asp.net,我使用以下代码刷新并结束向客户端的传输 Response.Flush(); Response.End(); 然而,我突然想到了这个响应。End将缓冲内容刷新到客户端。那么,在一个序列中使用这两种方法有什么意义呢?简言之,没有,但两者之间有重要的区别: Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端 回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。

我使用以下代码刷新并结束向客户端的传输

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

然而,我突然想到了这个响应。End将缓冲内容刷新到客户端。那么,在一个序列中使用这两种方法有什么意义呢?

简言之,没有,但两者之间有重要的区别:

Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端

回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。响应.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();
        }
    }
}

简言之,没有,但两者之间有重要区别:

Flush对于在所有处理完成之前写入响应的部分非常有用,也就是说,如果禁用了响应缓冲。刷新后的任何代码都将继续执行,之前的任何响应都将被刷新到客户端

回应。结局有点残酷。。。它不仅会中止当前线程,还会抛出ThreadAbort异常并终止当前请求。响应.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();
        }
    }
}

End是线程的异常结束,并调用事件EndRequest。Response.Flush:发送到客户端的所有当前缓冲输出力您应该在HttpApplication对象上使用CompleteRequest来结束请求并继续处理(如果需要)。不要使用Response.End。仔细阅读原因。被接受的答案最终会使用它,但您使用异常终止响应线程是否真的有很好的理由?@AndrewBacker不,没有。除非你算了,否则我总是这么做,所以它自然而然地成为了一个很好的理由。你是说一个人应该先冲水然后完成,对吗?我将直接转到Response.ContentType=text/xml;Response.WriteGetXmlData.InnerXml;回答:齐平;Context.ApplicationInstance.CompleteRequest;很好的信息。是的,这将关闭它并同时刷新,基本上只需跳到处理结束。End是我们在经典asp中使用的,我认为它只是延续了下来。直到几年前我才遇到CompleteRequest。。。可能在示例中有,但我只是跳过了它,因为我已经知道了哈。事实上,我在提供XML文件并完成CompleteRequest时出错,所以我被迫将其更改回去。我不知道为什么它不起作用。关于非法字符的某些信息…Response.End是线程的异常结束,并调用事件EndRequest。Response.Flush:发送到客户端的所有当前缓冲输出力您应该在HttpApplication对象上使用CompleteRequest来结束请求并继续处理(如果需要)。不要使用Response.End。仔细阅读原因。被接受的答案最终会使用它,但您使用异常终止响应线程是否真的有很好的理由?@AndrewBacker不,没有。除非你算了,否则我总是这么做,所以它自然而然地成为了一个很好的理由。你是说一个人应该先冲水然后完成,对吗?我将直接转到Response.ContentType=text/xml;Response.WriteGetXmlData.InnerXml;回答:齐平;Context.ApplicationInstance.CompleteRequest;很好的信息。是的,这将关闭它并同时刷新,基本上只需跳到处理结束。End是我们在经典asp中使用的,我认为它只是延续了下来。直到几年前我才遇到CompleteRequest。。。可能在示例中有,但我只是跳过了它,因为我已经知道了哈。事实上,我在提供XML文件并完成CompleteRequest时出错,所以我被迫将其更改回去。我不知道为什么它不起作用。一些关于非法字符的信息。。。