如何在ASP.NET中长时间操作期间显示“请稍候”消息?

时间:2012-03-03 18:00:31

标签: asp.net ajax asp.net-ajax

首次调用页面时,我希望在等待页面加载时显示“请稍候”消息。但是,在下面的示例中,在 someLongProcess 完成之前,页面不会呈现。

我怀疑我需要使用像AJAX之类的东西来显示最初的“请等待”消息然后开始我的初始处理。有什么建议吗?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        Call SetupGUI() 'user doesnt see this setup until page is rendered.
        Call someLongProcess()
    End If
End Sub

3 个答案:

答案 0 :(得分:3)

您将看到为此要求创建异步页面的内容。这里有一篇很好的文章http://msdn.microsoft.com/en-us/magazine/cc163725.aspx,可以很好地解释这个过程。这是一篇较旧的文章,所以要考虑它的价值。另外,请查看PageAsyncTask类http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx

上面的链接可以让你朝着正确的方向前进。

答案 1 :(得分:3)

让我首先描述在你解释之前你的做法是什么,你怎么能完成你的任务

当你编写这段代码时,你假设客户端和服务器以某种方式连接,并且可以随时与对方交谈。可悲的是,事实并非如此。 HTTP是无状态协议。您可能想知道,无状态协议意味着什么?

假设服务器是詹姆斯,他有电话线,没有来电显示。他每天都会从不同的客户那里得到一千个电话询问问题。现在詹姆斯非常知识渊博,可以快速回答这些问题但是一旦他从客户那里打折,他就不能回电话了(记住没有来电显示,意味着詹姆斯不能回电给客户)。

这一切都好,当你有一个简短的问题要问但是如果你有问题要求詹姆斯考虑答案,你要么需要等待,而詹姆斯认为,或者你想让詹姆斯给你回电话。

要在手机上等待,您需要在webconfig中增加ASP.Net executionTimeOut值。默认值为110秒,当您等待答案时,您可以使用下面的代码显示加载/进度微调器

<div id="preloader" style="width: 100%; text-align: center;">
                    <img src="../Images/loading.gif" alt="" style="display: block;" />
                </div>

<script language="javascript" type="text/javascript">
    function HidePreloader() {
        if (document.getElementById('preloader') != null) {
            document.getElementById('preloader').style.visibility = 'hidden';

        }
    }
</script>

点击按钮/链接即可调用函数HidePreloader。

这都是笨拙的海鲂,但记住詹姆斯是一个老家伙,他只能同时听10个电话。如果有10个人已经带到詹姆斯那么,他将无法接听第11个电话。这不好,我们想要的是詹姆斯给我们回电话的方式。我们想给詹姆斯一个来电显示。可悲的是,在Windows 8服务器之前,只有那些支持websockets的客户端(浏览器)才能使用来电显示。

那么我们还能做些什么呢?我们怎样才能解决这个问题呢,等等,如果我们给詹姆斯我们的名字并告诉他,我会在5分钟后回电话看看你是否已经找到了答案。这称为民意调查。基本上,您要求服务器完成长时间运行的任务,服务器会为您提供令牌。每隔几分钟或几秒钟,你问服务器,这是我的令牌,是我的任务完成。如果任务完成,则使用新数据填充页面。传统上,这是使用Javascript和Web服务完成的。您还可以查看此框架SignalIR,它提供了完成此类操作的方法。

希望这个心理模型能够帮助您更好地理解HTTP的无状态特性。

答案 2 :(得分:1)

你提到过AJAX。如果你想用JavaScript做,可能是这样的:http://pure-essence.net/2010/01/29/jqueryui-dialog-as-loading-screen-replace-blockui/