none
Problema con Mysql C# y async WinForms RRS feed

  • Pregunta

  • Hola!

     Estoy programando un CRUD el cual como base de datos utiliza una ubicación remota vía red. Diseñe una capa de abstracción para las consultas a la base a fin de poder migrar más rapidamente de conector en caso de necesitarlo.

    Ahora bien el problema surge cuando quiero utilizar la app , la misma se congela pese a implementar el async/await y utilizar el conector mysqlconnector que es 100 % asincrono su implementación.  Yo pense que al implementar el await en las consutlas estas pasarían a un segundo hilo y no se me congelaria la interfaz.

    ¿Hay algun ejemplo o documentación para poder entender como implementar bien el asincronismo en consultas a base de datos remotas?.

    Gracias

    viernes, 27 de diciembre de 2019 14:59

Respuestas

  • hola

    >>Diseñe una capa de abstracción para las consultas a la base a fin de poder migrar más rapidamente de conector en caso de necesitarlo

    Eso no es un buen diseño, se supone que programes en capas, no algo que encapsule al conector, eso no esta bueno

    >>la misma se congela pese a implementar el async/await y utilizar el conector mysqlconnector que es 100 % asincrono su implementación.

    deberias poner el codigo que implementaste, si usas incorrectamente el async igual se va a bloquear

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de diciembre de 2019 22:01
  • Gracias Leandro por responder . Tarde en responder.

    Te adjunto un ejemplo de como uso el async await con la base de datos.

    public async Task<responseSQL> executeNonQuery(string cmd)
    {
      //-- Configuro salida
      responseSQL _r;
    
      //-- Conecto
      using(MysqlConnection cn = new MySqlConnection(con)){
    
        //-- Comando
        using(MysqlCommand com = cn.CreateCommand()){
         
          await conn.OpenAsync(); //--ACA TENGO EL BLOQUEO
    
          com.CommandText = cmd;
    
          MysqlTransacction tr = await conn.BeginTransactionAsync();
    
         try{
    
          await tr.CommitAsync();
    
          _r.status = true;
    
    
          _r.responseData = (object)cmd;
    
    
        }catch(MysqlException ex){
    
          _tr.rollback();
    
        }
    
    }

    El objetivo es poder trabajar con una base de datos remota sin usar Azure sino usando un servidor MaríaDB remoto (fork mysql) y que la interfaz grafica no se bloquee mientras consulta o transacciona con el servidor.

    Estuve buscando ejemplos de uso de base de datos sql server o mysql server o mariadb remotos pero no encontre nada , le consulte a un instructor en udemy y tampoco me respondío. Consulte el libro de c# de pearson que tengo pero solamente habla de hilos ya que es previo a la implementación de async await.

    Ojala puedas orientarme.

    Gracias por tu ayuda

    lunes, 30 de diciembre de 2019 17:33

Todas las respuestas

  • hola

    >>Diseñe una capa de abstracción para las consultas a la base a fin de poder migrar más rapidamente de conector en caso de necesitarlo

    Eso no es un buen diseño, se supone que programes en capas, no algo que encapsule al conector, eso no esta bueno

    >>la misma se congela pese a implementar el async/await y utilizar el conector mysqlconnector que es 100 % asincrono su implementación.

    deberias poner el codigo que implementaste, si usas incorrectamente el async igual se va a bloquear

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 27 de diciembre de 2019 22:01
  • Gracias Leandro por responder . Tarde en responder.

    Te adjunto un ejemplo de como uso el async await con la base de datos.

    public async Task<responseSQL> executeNonQuery(string cmd)
    {
      //-- Configuro salida
      responseSQL _r;
    
      //-- Conecto
      using(MysqlConnection cn = new MySqlConnection(con)){
    
        //-- Comando
        using(MysqlCommand com = cn.CreateCommand()){
         
          await conn.OpenAsync(); //--ACA TENGO EL BLOQUEO
    
          com.CommandText = cmd;
    
          MysqlTransacction tr = await conn.BeginTransactionAsync();
    
         try{
    
          await tr.CommitAsync();
    
          _r.status = true;
    
    
          _r.responseData = (object)cmd;
    
    
        }catch(MysqlException ex){
    
          _tr.rollback();
    
        }
    
    }

    El objetivo es poder trabajar con una base de datos remota sin usar Azure sino usando un servidor MaríaDB remoto (fork mysql) y que la interfaz grafica no se bloquee mientras consulta o transacciona con el servidor.

    Estuve buscando ejemplos de uso de base de datos sql server o mysql server o mariadb remotos pero no encontre nada , le consulte a un instructor en udemy y tampoco me respondío. Consulte el libro de c# de pearson que tengo pero solamente habla de hilos ya que es previo a la implementación de async await.

    Ojala puedas orientarme.

    Gracias por tu ayuda

    lunes, 30 de diciembre de 2019 17:33