Stack Overflow en español Asked by sebastian bizama inostroza on December 2, 2021
como trasformar el metodo a asincrono de manera que se ejecute esta acción en segundo plano.
public void cargar_datos()
{
MySqlCommand cmd = new MySqlCommand("select id_zona, descripcion_zona from tb_zonas", conexion.obtenerConexion());
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
//con.Close();
conexion.obtenerConexion().Close();
DataRow fila = dt.NewRow();
fila["descripcion_zona"] = "selecciona una ubicacion";
dt.Rows.InsertAt(fila, 0);
combo_zona.ValueMember = "id_zona";
combo_zona.DisplayMember = "descripcion_zona";
combo_zona.DataSource = dt;
}
La forma de hacerlo es mediante Task; y el fallo que se obtiene en los combos es porque se crearon en el hilo principal yno se pueden actualizar directamente dentro de otro hilo. Yo primero haría la función cargar datos de la siguiente forma donde retorna un DataTable con el resultado de la carga:
public DataTable cargar_datos()
{
MySqlCommand cmd = new MySqlCommand("select id_zona, descripcion_zona from tb_zonas", conexion.obtenerConexion());
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
//con.Close();
conexion.obtenerConexion().Close();
DataRow fila = dt.NewRow();
fila["descripcion_zona"] = "selecciona una ubicacion";
dt.Rows.InsertAt(fila, 0);
return dt;
}
Y ahora la función asíncrona que logra cargar los datos en otro hilo sería así:
public async void cargarDatos_Async()
{
Task<DataTable> miTask = new Task<DataTable>(cargar_datos);
// Iniciamos el hilo
miTask.Start();
// Esperamos el resultado en el nuevo hilo
DataTable result = await miTask;
// Actualizamos los combos una vez terminada la tarea.
combo_zona.ValueMember = "id_zona";
combo_zona.DisplayMember = "descripcion_zona";
combo_zona.DataSource = result;
}
Answered by Antonio S.F. on December 2, 2021
Utiliza Task.Factory.StartNew(Action t)
que acepta un action que lo ejecutara asincronamente:
public void cargar_datos() {
System.Threading.Task.Task.Factory.StartNew(()=>{
MySqlCommand cmd = new MySqlCommand("select id_zona, descripcion_zona from tb_zonas", conexion.obtenerConexion());
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
//con.Close();
conexion.obtenerConexion().Close();
DataRow fila = dt.NewRow();
fila["descripcion_zona"] = "selecciona una ubicacion";
dt.Rows.InsertAt(fila, 0);
combo_zona.ValueMember = "id_zona";
combo_zona.DisplayMember = "descripcion_zona";
combo_zona.DataSource = dt;
});
}
Answered by Einer on December 2, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP