2

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

有没有一种简单的方法可以做到这一点?

我已经尝试将它放在页面的Disposed事件中,但这似乎没有触发,并且在Unload事件中但触发得太快了。我宁愿不必产生一个线程,但如果这就是它所需要的,我也许可以。

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

4

7 回答 7

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 对同时请求的数量有一个可配置的限制。你想要简单,我认为这很简单。

于 2009-07-24T19:55:41.507 回答
3

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

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

于 2009-07-24T20:20:07.917 回答
1

您正在寻找一个异步进程。AJAX 允许这样做以及其他实现。搜索 Async 和 ASP.Net,您会发现大量资源。

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

于 2009-07-24T19:29:51.637 回答
1

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

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

于 2009-07-24T19:34:11.907 回答
1

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

也许这个howto会帮助你:

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

希望能帮到你

于 2009-07-24T19:37:31.417 回答
0

与其将其记录到您的日志中,不如将其创建一个字符串(使用 StringBuilder),并在最后将整个字符串推入 Log。

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

于 2009-07-24T19:41:07.493 回答
0

它是什么类型的日志记录,它要去哪里?

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

于 2009-07-24T19:42:04.840 回答