Ajax, Llamada a Web Method con Threads
Para cuando se necesita lanzar un multiples llamadas y no queremos estar yendo y viniendo al servidor con llamadas Ajax sin penalizar en tiempo nuestra aplicación. Necesitaremos hacerlo con Threads.
Crearemos una función a la que llamar en cada Thread.
public static void GetEntradasYSalidasMensuales(object o)
{
ParametrosThread p = (ParametrosThread)o;
string sql = "";
if (p.ofilt == "off")
{
sql = @".... AQUI IRA VUESTRA SELECT CON LOS VALORES A RECUPERAR..";
}
else
{
sql = @".... AQUI IRA VUESTRA SELECT CON LOS VALORES A RECUPERAR..";
}
try
{
DataSet ds = Intranet.Data.DataAccess.ReadDataSet(p.oIP, p.oPuerto, p.oInitialCatalog, p.oCatalogSufix, p.oCadenaDeConexionProviSport, p.oIDUsuarioActivo, Convert.ToInt16(p.oIDInstalacion), string.Format(sql, Provis.Funciones.Fechas.GetDateForSql(p.fechaInicio), Provis.Funciones.Fechas.GetDateForSql(p.fechaInicio.AddMonths(-1))));
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = ds.Tables[0].Rows[0][0];
dr["Salidas"] = ds.Tables[0].Rows[0][1];
dtEstadisticas.Rows.Add(dr);
}
else
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = "";
dr["Salidas"] = "";
dtEstadisticas.Rows.Add(dr);
}
}
catch (Exception ex)
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = "";
dr["Salidas"] = "";
dtEstadisticas.Rows.Add(dr);
}
}
Cuando todos los Threads terminen. Pasaremos a montar las filas, que devolveremos a la llamada de Ajax que enviamos desde el Aspx.
DataView dv = dtEstadisticas.DefaultView;
dv.Sort = "idInstalacion";
DataTable sortedDT = dv.ToTable();
foreach (DataRow drow in sortedDT.Rows)
{
string nomInstalacion = "";
nomInstalacion = drow["nombreInstalacion"].ToString();
EntradasActual = "";
SalidasActual = "";
if (drow["Entradas"].ToString() != "") EntradasActual = Convert.ToDecimal(drow["Entradas"]).ToString("#,###,##0");
if (drow["Salidas"].ToString() != "") SalidasActual = Convert.ToDecimal(drow["Salidas"]).ToString("#,###,##0");
EstEntraActual = drow["Entradas"].ToString();
EstSalidActual = drow["Salidas"].ToString();
/********************* DATOS DE LA TABLA **********************/
html += " " +
"
" + nomInstalacion +
"
" + "
" +
EntradasActual +
"
" + "
" +
SalidasActual +
"
" + "
";
/************ FIN TABLA ************************/
}
DatosDevueltos += html;
DatosDevueltos += " | " + datosGrafica;
return DatosDevueltos;
Espero os sirva de guía para vuestros proyectos.
Para ello en el Aspx, meteremos una sola llamada al Web Method. El cual nos devolverá las filas de una tabla formateadas y separadas por '|'. Yo mando dos parámetros para filtrar que son una fecha y un booleano.
$.ajax({
type: "POST", url: "EntradasYSalidasMensualesMulti.aspx/TraerDatosInstalacionesMethod",
data: "{ fecha: '" + fe + "', filt: '" + hdTodos + "' }",
contentType: "application/json; charset=utf-8",
dataType: "json",
async: false,
success: function (response) {
htmlTabla += response.d;
},
error: function (msg) { }
});
Dentro del Code-behind. Crearemos una lista de threads y una Variable global de tipo DataTable para ir insertando los valores devueltos por los threads.
List lTh = new List();
try
{
.
.
.
dtEstadisticas = new DataTable();
dtEstadisticas.Columns.Add("idInstalacion", typeof(Int16));
dtEstadisticas.Columns.Add("nombreInstalacion");
dtEstadisticas.Columns.Add("Entradas");
dtEstadisticas.Columns.Add("Salidas");
foreach (DataRow oDr in oDsInstalaciones.Tables[0].Rows)
{
string oIDInstalacion = oDr["IDInstalacion"].ToString();
string oIP = oDr["IP"].ToString();
string oPuerto = oDr["Port"].ToString();
string oInitialCatalog = oDr["InitialCatalog"].ToString();
string oCatalogSufix = oDr["CatalogSufix"].ToString();
string connStr = "tcp://" + oIP + ":" + oPuerto + "/Provis.ProviSport.rem";
string nombreInstalacion = oDr["NombreInstalacion"].ToString();
if (oIP != "0.0.0.0")
{
string str = TUsuarios.IDUsuarioActivo.ToString();
ParametrosThread p = new ParametrosThread(Convert.ToDateTime(fecha), oIP, oPuerto, oInitialCatalog, oCatalogSufix, oIDInstalacion, Varios.cadenaDeConexionProviSport, TUsuarios.IDUsuarioActivo, nombreInstalacion, filt);
Thread t = new Thread(new ParameterizedThreadStart(GetEntradasYSalidasMensuales));
t.Start(p);
lTh.Add(t);
}
}
Thread tA = new Thread(new ParameterizedThreadStart(abortar));
tA.Start(lTh);
foreach (Thread t in lTh)
{
if (t.ThreadState == ThreadState.Running)
t.Join(10000);
}
Crearemos una función a la que llamar en cada Thread.
public static void GetEntradasYSalidasMensuales(object o)
{
ParametrosThread p = (ParametrosThread)o;
string sql = "";
if (p.ofilt == "off")
{
sql = @".... AQUI IRA VUESTRA SELECT CON LOS VALORES A RECUPERAR..";
}
else
{
sql = @".... AQUI IRA VUESTRA SELECT CON LOS VALORES A RECUPERAR..";
}
try
{
DataSet ds = Intranet.Data.DataAccess.ReadDataSet(p.oIP, p.oPuerto, p.oInitialCatalog, p.oCatalogSufix, p.oCadenaDeConexionProviSport, p.oIDUsuarioActivo, Convert.ToInt16(p.oIDInstalacion), string.Format(sql, Provis.Funciones.Fechas.GetDateForSql(p.fechaInicio), Provis.Funciones.Fechas.GetDateForSql(p.fechaInicio.AddMonths(-1))));
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = ds.Tables[0].Rows[0][0];
dr["Salidas"] = ds.Tables[0].Rows[0][1];
dtEstadisticas.Rows.Add(dr);
}
else
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = "";
dr["Salidas"] = "";
dtEstadisticas.Rows.Add(dr);
}
}
catch (Exception ex)
{
DataRow dr = dtEstadisticas.NewRow();
dr["idInstalacion"] = Convert.ToInt16(p.oIDInstalacion);
dr["nombreInstalacion"] = p.oNombreInstalacion;
dr["Entradas"] = "";
dr["Salidas"] = "";
dtEstadisticas.Rows.Add(dr);
}
}
Cuando todos los Threads terminen. Pasaremos a montar las filas, que devolveremos a la llamada de Ajax que enviamos desde el Aspx.
DataView dv = dtEstadisticas.DefaultView;
dv.Sort = "idInstalacion";
DataTable sortedDT = dv.ToTable();
foreach (DataRow drow in sortedDT.Rows)
{
string nomInstalacion = "";
nomInstalacion = drow["nombreInstalacion"].ToString();
EntradasActual = "";
SalidasActual = "";
if (drow["Entradas"].ToString() != "") EntradasActual = Convert.ToDecimal(drow["Entradas"]).ToString("#,###,##0");
if (drow["Salidas"].ToString() != "") SalidasActual = Convert.ToDecimal(drow["Salidas"]).ToString("#,###,##0");
EstEntraActual = drow["Entradas"].ToString();
EstSalidActual = drow["Salidas"].ToString();
/********************* DATOS DE LA TABLA **********************/
html += " " +
"
" + nomInstalacion +
"
" +
EntradasActual +
"
" + "
" +
SalidasActual +
"
" + "
";
/************ FIN TABLA ************************/
}
DatosDevueltos += html;
DatosDevueltos += " | " + datosGrafica;
return DatosDevueltos;
Espero os sirva de guía para vuestros proyectos.
Comentarios
Publicar un comentario