que estoy tratando de mostrar de forma asíncrona de datos en paneles de actualización en un sitio web donde las tareas de recuperación de datos tienen diferentes tiempos. Me gustaría actualizar cada panel para mostrar los datos en la página después de que termine cada tarea.ASP.Net: Panel de actualización asíncrona de carga con dos paneles de actualización
Sin embargo, no importa lo que intente, todos los paneles Actualizar cambiar su contenido después de la última tarea se ha completado.
Por ejemplo:
tengo dos tareas:
- Uno que intenta actualizar una etiqueta en UpdatePanel1 después de 5 segundos
- Uno que intenta actualizar una etiqueta en UpdatePanel2 después de 10 segundos
El resultado esperado es que hav Solo la etiqueta en UpdatePanel1 cambia después de 5 segundos; sin embargo, ambos paneles de actualización se actualizan al mismo tiempo, en 10 segundos.
Ambos paneles de actualización se ajustan a UpdateMode = "condicional" y se les dice que la devolución de datos desde JavaScript cliente. A continuación se encuentra una lista completa del ejemplo anterior.
¿Qué me falta aquí? ¿Cómo puedo cargar un panel de actualización, y luego el otro, haciendo que ambas tareas se ejecuten de forma asíncrona?
Gracias,
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>
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();
}
}