【问题标题】:Using Response Flush in WebControl在 WebControl 中使用响应刷新
【发布时间】:2012-03-23 12:36:01
【问题描述】:

我想在 web 控件中使用某种逐步渲染,这是一个示例(不按预期工作)

public class Price : WebControl
{

    protected override void Render(HtmlTextWriter output)
    {
        HttpResponseBase response = new HttpResponseWrapper(new HttpResponse(output));

        //Panel basePanel = new Panel() { ID = "basePanel" };
        //Controls.Add(basePanel);
        //var loaderImage = LoaderAnimation();
        //Controls.Add(loaderImage);

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("aaa "));
        response.Flush();

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("bbb "));
        response.Flush();

        System.Threading.Thread.Sleep(500);
        Controls.Add(new LiteralControl("ccc "));

        base.RenderContents(output);
    }
}

这应该在每次刷新时呈现。也许这是一种糟糕的技术,但我喜欢这方面的一些建议。

【问题讨论】:

    标签: c# flush


    【解决方案1】:

    您的方法可能无法按预期工作。如果您想要逐步渲染(我不是在问为什么),您应该解决类似AJAX 的问题。

    涉及的内容太多(网络、客户端和服务器端的缓冲、在浏览器中呈现,这非常依赖于当前元素以外的其他元素的结束标签等),您可以使用一种方法来简单地暂停生成内容的间歇性。

    如果您想在服务器上显示诸如较长时间进程的进度,请让另一个后台线程完成这项工作,并让客户端每 X 秒轮询一次以获取更新。 JSON 和 AJAX 是您的朋友,您可以向用户展示缓慢增长的页面/内容。

    这具有额外的效果,您可以先呈现整个页面(即有效的 HTML,包括 html 结束标记),然后更新 HTML 页面中间的部分。

    【讨论】:

      【解决方案2】:

      要按照您尝试的方式进行操作,您需要使用(可能)调用 .ToString() 来呈现控件。然后,在调用 response.Flush() 之前调用 response.Write(yourString)。

      Abel 提到的方法是,IMO,一种更好的方法。

      这篇博文表明您需要调用 response.Flush 两次...这可能适用于您正在做的事情。当我需要做类似的事情时,我会使用 Abel 的方法。

      http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/08/improve-your-asp-net-website-user-experience-flush-down-your-partial-response.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        • 2014-08-28
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多