• 【原创】也谈“异步”响应


    如果Server端处理Client端的响应需要的时间太长,这时候给用户显示另一个界面来告知用户示服务器正在处理,请用户稍等,这样显然更友好一些!

    解决这个需求貌似有个现成的解决方案, ASP.NET AJAX有个控件叫UpdateProgress, 用法可以参见这里。但是这个UpdateProgress有个缺点,就是它会自动对它所关联的UpdatePanel里面的所有控件(Button),也是就是它的粒度是UpdatePanel级别的,而不是具体某个控件级别的。当然,可以把要关联的控件单独放在一个UpdatePanel里面,但是这显然很不灵活。而且,UpdateProgress不会把当前的界面隐藏,而只是在当前页面的基础之上“增加”了一些显示服务器正在处理,请稍后的信息。这个不符合我想要的结果---当服务器端响应客户端请求的时候隐藏当前界面,显示一个中间结果,当请求响应完毕的时候再显示原来的界面。

    还有另外两个貌似可以解决的方案,一个运用Asynchronous Delegate来处理比较耗时的请求,让当前的Postback很快返回给客户端。但是这种方法最大的困难在于,当Server端处理完这个请求的时候怎么通知页面来更新状态。因为Web Application不同于Desktop Application,当页面请求完成之后,当前的页面的所有对象都被destroy了。 

    另外一个是注意到“Async Page”,但是这个ASP.NET提供的Feature与我的需求相去甚远, Async Page的意思是当Server端响应一个比较耗时的页面请求时候,会从Thread Pool中取出一个thread来处理这个耗时的请求,这样不至于使得所有的客户端的请求都hog一个很长时间的thread,不利于很多页面请求的web site.

    回归到解决这个问题本身,其实解决方法也很直观,当页面PostBack的时候,用Javascript隐藏当前的界面,显示中间界面即可。

    举个例子:

    ASPX页面代码:

    这个页面很简单,就是一个TextBox模拟用户请求状态, 这个TextBox放在一个DIV (ID = “ChangeTextDiv”)里面,这个DIV默认是可见的。

    另外一个DIV(ID=”IntermediatePageDiv“),顾名思义,这个DIV是在服务端响应客户请求是显示的中间界面。

    控制这两个DIV的显示和消失,自然是通过Javascript来动态设置它们的class (style).

    注意Button (BtnPostBack )同时注册了两个事件处理函数,

    OnClick="BtnPostBack_Click" OnClientClick="ChangeStyle();"
       1: <html xmlns="http://www.w3.org/1999/xhtml" >
       2:     <head runat="server">
       3:         <title>Untitled Page</title>
       4:         <link href="App_Themes/Stylesheet1.css" rel="stylesheet" type="text/css" />
       5:         <script type="text/javascript">
       1:  
       2:            function ChangeStyle()
       3:            {
       4:               var div1 = document.getElementById("ChangeTextDiv");
       5:               div1.className="NoDisplay";
       6:               
       7:               var div2 = document.getElementById("IntermediatePageDiv");
       8:               div2.className="";
       9:            }
      10:          
    </script>
       6:     
       7:     </head>
       8:     <body>
       9:         <form id="form1" runat="server">
      10:        
      11:         <asp:Button Text="Request" ID="BtnPostBack" OnClick="BtnPostBack_Click" OnClientClick="ChangeStyle();" runat="server" />
      12:         
      13:         <div id="ChangeTextDiv">
      14:          <asp:TextBox ID="TbChangeText" Text="Change Me" runat="server"></asp:TextBox>
      15:         </div>
      16:        
      17:        <div id="IntermediatePageDiv" class="NoDisplay">
      18:           Please wait while processing the request...
      19:        </div>
      20:           
      21:         </form>
      22:     </body>
      23: </html>

    CSS:

       1: .NoDisplay
       2: {
       3:     display:none
       4: }

    CS 代码很简单,用Thread.Sleep(2000)来模拟比较耗时的页面请求处理,

       1: protected void BtnPostBack_Click(object theSender, EventArgs theEventArgs)
       2: {
       3:     Thread.Sleep(2000);
       4:     TbChangeText.Text = "Complete your request!";
       5: }

    That's It!

    相关界面显示如下:

    temp1   temp2  temp3

    -- The End--

    <<<< 续>>>

    可以设置DIV的样式,使得每次显示提示信息的时候显示在页面的中央位置....

    <div id="IntermediatePageDiv" class="NoDisplay" style="border:solid 1px Black; width:200px; height:200px;
        margin:auto auto">
          Please wait while processing the request... 
    </div>
  • 相关阅读:
    公司系统缓慢-分析数据库CPU过高原因-连接数
    克隆虚拟机的相关设置
    centos7基本设置和优化
    遇到的问题和解决集中
    chrome优化调教
    shell三剑客之小弟grep
    迭代器和生成器
    函数进阶
    函数介绍&参数的使用
    文件处理中光标的移动以及文件的修改
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1598620.html
Copyright © 2020-2023  润新知