代码之家  ›  专栏  ›  技术社区  ›  BCS

ASP.NET页可以在页完成加载后进行一些处理吗?

  •  2
  • BCS  · 技术社区  · 15 年前

    我有一个ASP.NET页面加载时间太长。一点测试表明 服务器端 日志记录占用了相当长的时间(因为用户不需要查看日志记录结果),我希望将其延迟到页面加载之后。

    有简单的方法吗?

    我试过把它放在书页上 Disposed 事件,但似乎没有发生 Unload 但那太快就要发生了。我宁愿不产生一个线程,但如果这是需要的话,我可能能够。

    我是 不是 正在查找Ajax。我想做一个正常的完整页面加载,然后在页面加载后(从客户端看到)做一点更多的处理。

    7 回复  |  直到 15 年前
        1
  •  9
  •   Thorarin    15 年前

    这似乎有效:

    protected void Page_Unload(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.Close();
        Thread.Sleep(20000); // Do processing here instead of sleeping :)
        Debug.WriteLine("Done!");
    }
    

    你提到卸载事件太快了,但我觉得它是正确的时间。您只需要手动关闭连接。脸红似乎也是强制性的,这有点奇怪,因为我认为当你关门时,脸红是隐性的。

    这可能有一些缺点,因为它使处理请求的进程一直很忙,无法处理下一个HTTP请求。然而,iis7对同时请求的数量有一个可配置的限制。你想要简单,我认为这是最简单的。

        2
  •  3
  •   Babak Naffas    15 年前

    您是否考虑过创建一个日志记录服务,它将一个消息队列记录下来,并只在自己的线程中执行日志记录?

    使用此方法,您可以将所有日志记录保留在代码中以前的位置,并且只对日志记录方法进行异步调用。

        3
  •  1
  •   Jay    15 年前

    您正在寻找一个异步进程。Ajax允许这样做以及其他实现。搜索async和asp.net,你会发现大量的资源。

    基本上,当用户界面继续呈现时,网页会启动并在单独的线程中运行进程。

        4
  •  1
  •   Lou Franco    15 年前

    在记录之前,尝试对响应流调用flush。在发送整个响应之前,不会激发卸载。如果在那里刷新(),然后记录,那么它应该是页面所做的最后一件事情。

    效果应该是用户看到了页面,但直到日志完成后才完成加载。但是他们可以与页面交互,所以他们可能不在乎。

        5
  •  1
  •   OemerA    15 年前

    这在异步线程中是可能的。 我们为客户创建了一个页面,该页面每2分钟检查一次是否有更新,如果有,我们会更新该页面。

    也许这个方法可以帮助你:

    http://www.eggheadcafe.com/articles/20060918.asp

    希望能帮到你

        6
  •  0
  •   shahkalpesh    15 年前

    不要将其记录到日志中,而是从中创建一个字符串(使用StringBuilder),并将整个字符串推向日志的末尾。

    如果由于异常而无法加载页面,则可能会丢失日志记录。
    如果我没有正确理解这个问题,请原谅我。

        7
  •  0
  •   Joshua    15 年前

    它是什么样的伐木,它要去哪里?

    一种方法可能是分离另一个线程(您需要增加ASP.NET可用的线程数量)并在其中执行登录。您可以使用参数化的threadstart并传递一个用于日志记录的对象。(不过,不要传递数据库连接/命令对象,那会很糟糕!)