在WebControl中使用Response Flush

时间:2012-03-23 12:36:02

标签: c# flush

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

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);
    }
}

这应该在每次冲洗时呈现。也许这是一种可怕的技术,但我喜欢这方面的一些建议。

2 个答案:

答案 0 :(得分:3)

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

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

如果要在服务器上显示类似于较长时间进程的进度,请让另一个后台线程执行该操作,让客户端每X秒轮询一次以获取更新。 JSON和AJAX是您的朋友,您可以向用户显示缓慢增长的页面/内容。

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

答案 1 :(得分:1)

要按照您尝试的方式执行此操作,您需要使用(可能).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