ASP.Net:异步更新面板加载两个更新面板

8 c# updatepanel asp.net-ajax

我试图在数据检索任务需要不同时间的网站上的更新面板中异步显示数据.我想更新每个面板,以在每个任务完成后显示页面上的数据.

但是,无论我尝试什么,所有更新面板在最后一个任务完成后更改其内容.

例如:

我有两个任务:

  • 尝试在5秒后更新UpdatePanel1中的标签的人
  • 尝试在10秒后更新UpdatePanel2中的标签的人

预期的结果是在5秒后只有UpdatePanel1中的标签发生变化,但是,两个更新面板同时更新,为10秒.

两个更新面板都设置为updatemode ="Conditional",并告诉他们从客户端javascript回发.以下是上述示例的完整列表.

我在这里错过了什么?如何加载一个更新面板,然后另一个,让两个任务异步运行?

谢谢,

TM值

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></title>
</head>
<body onload="partialPostback();">
    <script language="JavaScript" type="text/javascript">

    function partialPostback() {
        __doPostBack('UpdatePanel1', '');
        __doPostBack('UpdatePanel2', '');
    }
    </script>

    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server"/>

        5 sec:
        <asp:UpdatePanel ID="UpdatePanel1" runat="server"
         UpdateMode="Conditional" OnLoad="UpdatePanel1_Load">
            <ContentTemplate>
                <asp:Label ID="Label2" runat="server" Text="Label"/><br />
            </ContentTemplate>
        </asp:UpdatePanel><br />

        10 sec:
        <asp:UpdatePanel ID="UpdatePanel2" runat="server"
         UpdateMode="Conditional" OnLoad="UpdatePanel2_Load">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"/><br />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;

public partial class _Default : System.Web.UI.Page
{
    Thread t1;
    Thread t2;

    protected override void OnPreRender(EventArgs e)
    {
        if (t1 != null)
        { t1.Join(); }

        if (t2 != null)
        { t2.Join(); }

        base.OnPreRender(e);
    }

    protected void Page_Load(object sender, EventArgs e)
    { }

    protected void UpdatePanel1_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            ThreadStart tstart = new ThreadStart(DoWork1);
            t1 = new Thread(tstart);
            t1.IsBackground = true;
            t1.Start();
        }
    }

    protected void UpdatePanel2_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            ThreadStart tstart = new ThreadStart(DoWork2);
            t2 = new Thread(tstart);
            t2.IsBackground = true;
            t2.Start();
        }
    }

    private void DoWork1()
    {
        Thread.Sleep(5000);
        this.Label2.Text = "Done in 5 sec!";
        this.UpdatePanel1.Update();
    }

    private void DoWork2()
    {
        Thread.Sleep(10000);
        this.Label1.Text = "Done in 10 sec!";
        this.UpdatePanel2.Update();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*m L 0

我怀疑您没有像您认为的线程连接那样异步调用它。看起来您基本上是在说阻止 OnPrerender 直到线程 2 终止。因为 1 和 2 都是从同一个方法调用的,所以在两者都完成之前您会被阻塞。如果您添加一些写入行来查看调用的时间,可能会更容易看到正在发生的事情。

据我所知,我还怀疑 1 上的文本在预渲染完成之前不会真正更新。传统的 ASP.NET 在预渲染完成之前不会将任何内容发送回客户端。但我对更新面板不太了解,所以我可能会在那个面板上谈论垃圾,并预计会被降价......