我有一个ASP.NET页面需要很长时间才能加载。一点点测试表明,服务器端日志记录占用了相当多的时间(并且因为用户永远不需要查看日志记录结果)我想延迟它直到页面加载后。
有一种简单的方法吗?
我已经尝试将其放置在页面的Disposed
事件中,但似乎没有触发并且在Unload
事件中,但是太快了。我宁愿不必产生一个线程,但我可能能够做到这一点。
我 NOT 正在寻找AJAX。我想做一个正常的整页加载,然后在页面加载后(从客户端看)进行更多的处理。
答案 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并传递要用于记录的对象。 (不要传递数据库连接/命令对象,这很糟糕!)