我有一个加载时间过长的 ASP.NET 页面。一个小测试表明服务器端日志记录需要相当长的时间并且(因为用户永远不需要查看日志记录结果)我想将它延迟到页面加载之后。
有没有一种简单的方法可以做到这一点?
我已经尝试将它放在页面的Disposed
事件中,但这似乎没有触发,并且在Unload
事件中但触发得太快了。我宁愿不必产生一个线程,但如果这就是它所需要的,我也许可以。
我不是在寻找 AJAX。我想做一个正常的整页加载,然后在页面加载后(从客户端看)做更多的处理。
我有一个加载时间过长的 ASP.NET 页面。一个小测试表明服务器端日志记录需要相当长的时间并且(因为用户永远不需要查看日志记录结果)我想将它延迟到页面加载之后。
有没有一种简单的方法可以做到这一点?
我已经尝试将它放在页面的Disposed
事件中,但这似乎没有触发,并且在Unload
事件中但触发得太快了。我宁愿不必产生一个线程,但如果这就是它所需要的,我也许可以。
我不是在寻找 AJAX。我想做一个正常的整页加载,然后在页面加载后(从客户端看)做更多的处理。
这似乎有效:
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 对同时请求的数量有一个可配置的限制。你想要简单,我认为这很简单。
您是否考虑过创建一个日志服务,它需要一个消息队列来记录并只在自己的线程中执行日志记录?
使用它,您可以将所有日志记录保留在它们之前在代码中的位置,并且只需对日志记录方法进行异步调用。
您正在寻找一个异步进程。AJAX 允许这样做以及其他实现。搜索 Async 和 ASP.Net,您会发现大量资源。
基本上,您的网页会在 UI 继续呈现时启动并在单独的线程中运行进程。
在登录之前尝试在响应流上调用 Flush。直到发送整个响应之后才会触发卸载。如果你在那里 Flush() 然后登录,它应该是页面做的最后一件事。
效果应该是用户看到了页面,但在日志完成之前它还没有完成加载。但是他们可以与页面交互,所以他们可能不会在意。
这对于异步线程是可能的。我们为客户创建了一个页面,它每 2 分钟检查一次是否有更新,如果有,我们更新了页面。
也许这个howto会帮助你:
http://www.eggheadcafe.com/articles/20060918.asp
希望能帮到你
与其将其记录到您的日志中,不如将其创建一个字符串(使用 StringBuilder),并在最后将整个字符串推入 Log。
如果页面由于异常而无法加载,您可能会丢失日志记录。
请原谅我,如果我没有正确理解这个问题。
它是什么类型的日志记录,它要去哪里?
一种方法可能是分离另一个线程(您需要增加可用于 asp.net 的线程数量)并在那里执行日志记录。您可以使用 ParameterizedThreadStart 并传递一个用于记录的对象。(但不要传递数据库连接/命令对象,那会很糟糕!)