SQL - C# el Backgroundworker es muy lento

   
Vista:
Imágen de perfil de Juan Carlos

C# el Backgroundworker es muy lento

Publicado por Juan Carlos (3 intervenciones) el 04/09/2017 19:52:54
buenas tardes,


Poniendo en contexto: tengo una Desktop app que hace un par de cosas cosas 1) Descarga de un FTPS muchos archivos .rar 2) descomprime esos .rar y los archivos que tiene dentro(.csv) los inserta en una base de datos phpmyadmin.


el problema esta en que las tareas de descarga e insertar en la base de datos las tengo en backgroundworker (1y 2 Respectivamente) pero aunque la implementacion del backgroundworker me permitió que la app no se congelara y mostrara el progreso, ahora todo lo hace mucho mas lento. lo cual deja la app completamente mal parada ya que los datos son pensados para hacerse lo mas en tiempo real posible.

filezilla descarga por mucho mas rapido una misma cantidad de rchivos...



Necesito arreglar el problema que comento, si alguno tiene conocimiento o experiencia con este problema del backgroundworker agradeceria la ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

C# el Backgroundworker es muy lento

Publicado por Yamil Bracho (13 intervenciones) el 04/09/2017 20:03:23
Buenos estas haciendo 3 cosas en vez de una (solo descraga). Fiajte el proceso seria 1) Descargar el archivo 2) Una vez que haya terminado la descarga, descomprimes el archivo 3) Una vez que hayas descomprimido inicias la tarea de cargar a la BD
En cualquier caso una tarea debe esperar a que la anterior termine de procesarse (es lo que se conoce como Producto-Consumidor).
Creo que agilizarias el proceso si al decargar un archivo arrncas su procesamiento en vez de descargar todos y arrancar la tarea 2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos

C# el Backgroundworker es muy lento

Publicado por Juan Carlos (3 intervenciones) el 04/09/2017 20:05:40
las tareas son independientes, el usuario puede descargar cuantos archivos escoga y luego puede dar click a otro boton para iniciar la carga a la base de datos


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
 
    //conexion a base de datos para ralizar todo el proceso de volcado
    //con respectivas validaciones de autonomia
    double contin = 1;
    String glo = @"Server=" + SERV + ";Database=bd_est_airunity;UserID=" + USER + ";Password=" + PASS + "";
    MySqlConnection con = new MySqlConnection(glo); // Conexion Global
    String ins = @"Server=" + SERV + ";Database=bd_est_airunity;UserID=" + USER + ";Password=" + PASS + "";
    MySqlConnection con_aux = new MySqlConnection(ins); // Conexion auxiliar
    double count = Files_to_Upload.Length;
    //MessageBox.Show("Cuantos: " + count);
    foreach (string s in Files_to_Upload)
    {
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
            return;
        }
 
        inter_camp = true;
        result = Path.GetFileNameWithoutExtension(s);
        string TableName = result.Split('_')[0];
 
        anti_blank = TableName.Split(' ');//SOLUCION Problema del Blanck
 
        //MessageBox.Show(anti_blank[0]);
        string TN_Val = "";
        prim = false;
        foreach (string Cad in anti_blank)
        {
            if (prim == true)
            {
                TN_Val = TN_Val + "_" + Cad;
            }
            else
            {
                TN_Val = Cad;
            }
 
 
            prim = true;
 
        }
 
        //se crearan las tablas, una por una, primero la tabla, luego los campos y el insert
        //antes de pasar a una siguiente tabla
        string query = "CREATE TABLE IF NOT EXISTS `tbl_" + TN_Val + "` (`ID` int(11) NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`ID`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=1";
        MySqlCommand cmd = new MySqlCommand(query, con);
 
        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
 
 
        this.listBox1.Items.Add("File #: " + contin + " // Table: " + TN_Val + " // Inserted into DataBase");
 
 
        try
        {
            using (var fs = File.OpenRead(s))
            using (var reader = new StreamReader(fs))
 
 
                //se abre el while de la lectura del archivo .csv
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    values = line.Split(',');
 
                    if (inter_camp == true)
                    {
                        foreach (string Col in values)
                        {
 
                            anti_blank = Col.Split(' ');//SOLUCION Problema del Blanck
                            string Col_Val = "";
                            prim = false;
                            foreach (string Cad in anti_blank)
                            {
                                if (prim == true)
                                {
                                    Col_Val = Col_Val + "_" + Cad;
                                }
                                else
                                {
                                    Col_Val = Cad;
                                }
 
 
                                prim = true;
 
                            }
 
                            //MessageBox.Show(Col_Val);
 
                            // Entradas A foreach para validar Campos en la Tabla respectiva. 
                            string query_verif = "SHOW COLUMNS FROM tbl_" + TN_Val + " WHERE Field = '" + Col_Val + "'";
                            MySqlCommand cmd_verif = new MySqlCommand(query_verif, con);
                            con.Open();
                            MySqlDataReader myreader = cmd_verif.ExecuteReader();
                            if (myreader.Read())
                            {
 
                            }
                            else
                            {
 
                                //listBox1.Items.Add("Field: " + Col_Val + "  //  into Table: " + TN_Val + "  // Will be added");
                                //listBox1.Items.Add("//");
                                if (Col_Val == "DateTimeStart" || Col_Val == "DateTimeEnd" || Col_Val == "DateAndTimeStart" || Col_Val == "DateAndTimeEnd")
                                {
                                    string query_col = "ALTER TABLE `tbl_" + TN_Val + "` ADD `" + Col_Val + "` TIMESTAMP NOT NULL DEFAULT '0000-00-00'";
                                    MySqlCommand cmd_col = new MySqlCommand(query_col, con_aux);
                                    con_aux.Open();
                                    cmd_col.ExecuteNonQuery();
                                    con_aux.Close();
                                }
                                else
                                {
                                    string query_col = "ALTER TABLE `tbl_" + TN_Val + "` ADD `" + Col_Val + "` VARCHAR(50) NOT NULL";
                                    MySqlCommand cmd_col = new MySqlCommand(query_col, con_aux);
                                    con_aux.Open();
                                    cmd_col.ExecuteNonQuery();
                                    con_aux.Close();
                                }
 
 
                            }
 
                            con.Close();
                            inter_camp = false;
 
                        }
 
                    }
                    else
                    {
                        string ins_line = ",";
                        bool coma = false;
                        foreach (string ins_val in values)
                        {
                            if (coma == true)
                            {
                                ins_line = ins_line + ",";
                            }
                            //MessageBox.Show(ins_val);
                            string[] anti_backslash = ins_val.Split('\\');//SOLUCION Problema del Backslash
                            if (anti_backslash[0] == "C:" || anti_backslash[0] == "D:")
                            {
                                //MessageBox.Show("Existe el backslash");
                                ins_line = ins_line + "'" + ins_val + "\\" + "'";
                                //MessageBox.Show(ins_line); 
                            }
                            else
                            {
                                //MessageBox.Show("NOO Existe el backslash");
                                ins_line = ins_line + "'" + ins_val + "'";
                            }
 
                            coma = true;
 
                        }
 
 
                        try
                        {
                            string query_col = "INSERT INTO `tbl_" + TN_Val + "` VALUES ('null'" + ins_line + ")";
                            //MessageBox.Show("Query: " + query_col );  para saber el query
                            MySqlCommand cmd_col = new MySqlCommand(query_col, con_aux);
                            con_aux.Open();
                            cmd_col.ExecuteNonQuery();
                            con_aux.Close();
                            Thread.Sleep(50);
                        }
                        catch (MySqlException ex)
                        {
                            listBox1.Items.Add("File #: " + contin + " // Table: " + TN_Val + " // ERROR");
                            listBox1.Items.Add("---");
                            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            con_aux.Close();
                            //throw;
                        }
 
                        //MessageBox.Show("insert Into Realizado /// Revisa la Tabla ");
                    }
                    //GC.SuppressFinalize(reader);
                }
            listBox1.Items.Add("Success");
 
        }
        catch (Exception ex)
        {
            listBox1.Items.Add("AT File #: " + contin + " Try's ERROR");
            listBox1.Items.Add("---");
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
 
 
        //GC.SuppressFinalize(this);
        double Progreso = (contin / count) * 100;
        backgroundWorker1.ReportProgress((int)Progreso);
        listBox1.Items.Add("//");
        contin = contin + 1;
 
 
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

C# el Backgroundworker es muy lento

Publicado por Yamil Bracho (13 intervenciones) el 04/09/2017 20:58:38
La idea seria qiue inmediatamente que descraguesUN archivo lo comienzes a cargar a la BD de manera automatica...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

C# el Backgroundworker es muy lento

Publicado por leonardo_josue (1109 intervenciones) el 05/09/2017 18:29:27
Hola Juan Carlos...

Aquí vale la pena hacer varias acotaciones:

Primero, tienes que saber exactamente cuál de los procesos es el que se está tardando más, para de ahí poder determinar alguna acción. Si el problema radica en la forma en cómo descargas y descomprimes los archivos, entonces publica tu pregunta en el foro de C# para que sean los expertos en el lenguaje los que te puedan indicar una manera mejor para hacer estos procesos.

Ahora, bien, si el problema está en la parte de cargar la información de los archivos a la Base de datos, aquí habría que tomar las siguientes consideraciones:

1. Por lo que veo, lo que haces es tomar una serie de archivos CSV y subirlos a base de datos... la manera más rápida de hacer esto en MySQL es utilizando INSERT's masivos... en otras palabras utilizar LOAD DATA... si no sabes cómo funciona este comando, entonces pregúntale a SAN GOOGLE por algunos ejemplos.

2. Cuando subes información de forma masiva (BULK INSERT) es recomendable desactivar todos los constrains o índices que tengas en tu tabla destino... en tu ejemplo veo que utilizas un consecutivo como PRIMARY KEY, lo que puede alentar el proceso. Lo que yo haría sería subir primero el archivo CSV así, tal cual a una tabla temporal que no tenga ninguna restricción y después mediante algún procedimiento almacenado hacer la lógica para vaciar la información de la tabla temporal a la tabla final, (Numerar por ejemplo los registros de una tabla es algo muy sencillo que puedes hacer con una consulta) y hasta el final activar la PK, FK e índices que tenga la tabla.

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos

C# el Backgroundworker es muy lento

Publicado por Juan Carlos (3 intervenciones) el 06/09/2017 04:35:08
vale,

con lo que me comentas con respecto a las consultas es un dato muy util que me puede servir, y si tambien el problema radica en codigos de C# asi que tambien lo posteare

de antemano gracias por tu aporte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad