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

时间:2009-07-24 19:26:45

标签: asp.net background-process

我有一个ASP.NET页面需要很长时间才能加载。一点点测试表明,服务器端日志记录占用了相当多的时间(并且因为用户永远不需要查看日志记录结果)我想延迟它直到页面加载后。

有一种简单的方法吗?

我已经尝试将其放置在页面的Disposed事件中,但似乎没有触发并且在Unload事件中,但是太快了。我宁愿不必产生一个线程,但我可能能够做到这一点。

NOT 正在寻找AJAX。我想做一个正常的整页加载,然后在页面加载后(从客户端看)进行更多的处理。

7 个答案:

答案 0 :(得分:9)

这似乎有效:

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

你提到Unload事件过早发生,但我认为它是正确的。您只需手动关闭连接。法拉盛似乎也是强制性的,这有点奇怪,因为我认为当你关闭时,冲洗是隐含的。

这可能有一些缺点,因为它使处理请求的进程保持繁忙,无法处理下一个HTTP请求。但是,IIS7对并发请求的数量有可配置的限制。你想要简单,我认为这很简单。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

您正在寻找异步流程。 AJAX允许这个以及其他实现。搜索Async和ASP.Net,你会发现很多资源。

基本上,当UI继续呈现时,您的网页将启动并在单独的线程中运行进程。

答案 3 :(得分:1)

在记录之前尝试在响应流上调用Flush。在发送整个响应之后才会触发卸载。如果你在那里Flush()然后登录,它应该是页面的最后一件事。

效果应该是用户看到页面,但是在完成日志之前它没有完成加载。但是他们可以与页面进行交互,所以他们可能不在乎。

答案 4 :(得分:1)

这可以通过异步线程实现。 我们为客户创建了一个页面,如果有更新,则每2分钟检查一次,如果是,我们更新了页面。

也许这个指南会帮助你:

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

希望可以帮到你

答案 5 :(得分:0)

不是将其记录到日志中,而是使用StringBuilder创建一个字符串,然后将整个字符串推送到Log中。

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

答案 6 :(得分:0)

它是什么类型的日志记录以及它在哪里?

一种方法可能是剥离另一个线程(你需要增加asp.net可用的线程数量)并在那里执行日志记录。您可以使用ParameterizedThreadStart并传递要用于记录的对象。 (不要传递数据库连接/命令对象,这很糟糕!)