TransWikia.com

como trasformar metodo en c# a metodo async c#?

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;


        }

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP