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.

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

Entradas populares