C# ASP.NET-加载页面时显示消息

C# ASP.NET-加载页面时显示消息,c#,asp.net,javascript,C#,Asp.net,Javascript,我有一个页面,它在page_load方法中执行长时间运行的任务(10到15秒) 我有客户端javascript代码,可以向用户显示一个像样的“页面加载”动画gif 我能够从后面的代码调用JavaScript方法来显示“页面加载”动画gif,但是,长时间运行的任务挂起了UI,使得动画gif直到长时间运行的任务完成后才真正显示,这与我想要的正好相反 为了验证这一点,在我的page_load方法中,我调用JavaScript方法来显示动画gif。然后,我使用Thread.Sleep(10000)。发生

我有一个页面,它在page_load方法中执行长时间运行的任务(10到15秒)

我有客户端javascript代码,可以向用户显示一个像样的“页面加载”动画gif

我能够从后面的代码调用JavaScript方法来显示“页面加载”动画gif,但是,长时间运行的任务挂起了UI,使得动画gif直到长时间运行的任务完成后才真正显示,这与我想要的正好相反

为了验证这一点,在我的page_load方法中,我调用JavaScript方法来显示动画gif。然后,我使用Thread.Sleep(10000)。发生的情况是,动画gif直到Thread.Sleep完成后才显示

很明显,我做了一些不正确的事情

如有任何建议,将不胜感激

谢谢

克里斯

下面是代码隐藏的示例:

protected void Page_Load(object sender, EventArgs e)
    {
        ClientScript.RegisterStartupScript
              (GetType(), "Javascript", "javascript: ShowWaitIndicator(); ", true);

        Response.Flush();

        Thread.Sleep(10000);
    }

听起来像是在ASP onload进程之后显示Javascript onload。您可能希望将时间密集型操作延迟到Page.LoadComplete-这样,您的用户将在密集型操作发生之前看到Javascript呈现

然后,在函数完成后,根据需要更新页面内容


你能提供一个代码示例吗?

我通过在页面上放置一个计时器来实现这一点。在第一次勾选后,禁用它并运行任务

<asp:Timer runat="server" id="UpdateTimer" interval="500" ontick="UpdateTimer_Tick" />

原因是Page.Load事件在向客户端发送任何响应之前触发;因此,在客户端收到响应之前,客户端的任何指令(例如执行javascript)都不会出现


所以。。。将长时间运行的任务放置在Page.Load中不会产生您想要的效果。这听起来像是使用AJAX或其他形式的异步数据检索的一个例子。在这种情况下,您返回给客户机的页面不包含长期运行任务的结果——因此页面本身(带有微调器)快速加载,然后客户机请求数据;当数据准备好后(10-15秒后),您可以使用结果更新客户端中的DOM。

我会避免从代码后面调用JavaScript

相反,使用jQuery库。您可以使用以下代码在加载DOM后立即触发调用代码:

$(document).ready(function() {
     //Call your JavaScript method here.
});
您还需要将jQuery添加到页面中,这是一个来自Microsoft CDN的脚本。将此项添加到标记中以执行此操作:

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script>


这将在加载页面时立即调用GIF JavaScript方法,您可以消除Thread.Sleep。我假设您的动画GIF方法在10-15秒后自动隐藏图像。

以下示例适用于您。只需放置在页面加载事件中

  Response.Write("<div id=\"loading\" style=\"position:absolute; width:100%; text-align:center; top:300px;\"><img src=\"http://www.cse.iitk.ac.in/users/singhroh/images/loading.gif\" border=0></div>");
  Response.Flush();
  System.Threading.Thread.Sleep(5000);        
  Response.Write("script>document.getElementById('loading').style.display='none';</script>");
Response.Write(“”);
Response.Flush();
系统线程线程睡眠(5000);
Write(“script>document.getElementById('load').style.display='none';”);

老一套,你可以关闭缓冲。启用缓冲(默认情况下),页面在发送到客户端之前在其整体中生成。如果您关闭缓冲,它会在加载时发送,因此您可以发送html来打开加载图形,执行长时间运行的任务,然后发送一些javascript来关闭它。

我修改了原始帖子,以包含代码隐藏的示例。您不能从代码隐藏调用javascript。您所能做的就是将其添加到响应流中,这就是ClientScript.RegisterStartupScript所做的。这将最终被发送回浏览器。这是两个完全不同的背景。Codebehind在服务器上运行,javascript在浏览器上执行。我只使用Thread.Sleep来模拟长时间运行的任务。我尝试了你的方法,将Thread.Sleep(10000)放在page_load方法中,直到10秒后它才加载gif。明白了,我以为你在使用Thread.Sleep来延迟gif的消失。在这种情况下,尤德的回应是最好的选择。您仍然可以使用jQuery并使用“.ajax”方法调用带有“WebMethod”属性的页面方法。这里有一篇关于它的文章:您的webmethod将包含您的Thread.Sleep以模拟长时间运行的任务。如果有相同的想法,则需要您将Buffer=“false”添加到页面的top指令,否则它将一次显示所有内容。
  Response.Write("<div id=\"loading\" style=\"position:absolute; width:100%; text-align:center; top:300px;\"><img src=\"http://www.cse.iitk.ac.in/users/singhroh/images/loading.gif\" border=0></div>");
  Response.Flush();
  System.Threading.Thread.Sleep(5000);        
  Response.Write("script>document.getElementById('loading').style.display='none';</script>");