有谁知道么,我在客户端做了一个updatapanel,里面两个按钮,两个label显示按钮的结果,第一个在服务端用一个sleep(3000),第二个不sleep,当我按第一个不到3秒时候按第二个,然后第一个label便无法接受到更新了Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    
    
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" >
    <ContentTemplate>
        Name:<br />
        <asp:TextBox ID="tbName" runat="server"></asp:TextBox><br />
        Message:<br />
        <asp:TextBox ID="tbContent" runat="server" Rows="5" Columns="20" TextMode="MultiLine"></asp:TextBox><br />
        <asp:Button ID="btnSubmit" runat="server" Text="Button1" 
            onclick="btnSubmit_Click" /><br />
        
        <asp:Label ID="LbStatus" runat="server" Text="1" ></asp:Label>
        <asp:Label ID="Label1" runat="server" Text="2"></asp:Label>
        <asp:Button ID="Button1" runat="server" Text="Button2" 
            onclick="Button1_Click" />
    
    
    </ContentTemplate>
    </asp:UpdatePanel>
    
    </form>
</body>
</html>Default.aspx.cs
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        LbStatus.Text = string.Format("{0} says {1} at {2}", tbName.Text, tbContent.Text, DateTime.Now.ToLocalTime());
        System.Threading.Thread.Sleep(3000);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = string.Format("{0} says {1} at {2}", tbName.Text, tbContent.Text, DateTime.Now.ToLocalTime());
       
    }
}

解决方案 »

  1.   

    从楼主的需求来出发,这个要求貌似不好达到,因为我们大多数情况下当第二个请求发出的时候取消第一个请求,这个是ajax可以做到的,当要让第二个请求快于第一个请求,没想到什么好的办法
      

  2.   

    你可以尝试一下将两个button放入不同的updatepanel里.
    同一个updatepanel里正在执行一个操作的话你再去点另外需要dopostback的方法,就会报异常,所以很多时候做的时候是先将相关的控件enable掉.
      

  3.   

    如果在一个updatepanel里是不可能完成的,如果楼主想这样做,最好用二个
      

  4.   

    是不是这是updatepanel的局限性呢?
      

  5.   

    不是ajax的问题,而是状态问题。你触发第二个操作时,它提交的ViewState是第一个操作之前的。你可以为第一个操作的后台代码设置断点,它正确地执行了。这就好像你线程编程时“脏读”了共享变量(第一个正在修改的时候第二个线程读取了修改之前的脏数据)。你顶多可以定义逻辑让第一个操作未完成时第二个操作出现异常(并在客户端提示用户),而难以禁止用户在客户端过快地发起两次请求。
      

  6.   

    如果你设置断点,可以看到,尽管第一个请求是sleep了3秒钟,而第二个是没有延时,但是后台仍然是执行完了第一个请求才执行第二个请求,也就是说发出请求的顺序决定了后台处理的顺序,跟你sleep几秒没有发生关系。当然,这可能跟web服务器有关系,换一个更高级的web服务器进行测试可能就能做到真正的后台并行处理。