none
Problema con Aysnc y Await RRS feed

  • Pregunta

  • Hola!

     Gracias por tomarsela molestia en leer mi publicación.

      Estoy desarrollando un ABM en C# y como DB MySql (en un vps) ...el problema es que inicialmente diseñe todo pensando en un servidor local ideal , es decir sin demoras , con lo cual ahora mi aplicación se congela ante consultas que demoran más de lo habitual ...pense en aplicar asincronismo en las consultas y mostrar el tipico cargando... o barra de progreso circular , etc...pero el punto esta en lo siguiente: cuando quiero aplicar el metodo async a cualquier metodo dentro de mis clases me dice que no implementa GetAwaiter (estoy usando el patron TAP)...la duda es la siguiente:

    ¿Alguien puede mostrarme como implementar async await en cualquier clase y devolver un objeto personalizado?.

    No logro entender como funciona pese a ver muchos videos , y como ultimo recurso pense en usar el componente backgroundworker pero entiendo que ya va al desuso.

    Muchas gracias


      

    lunes, 18 de junio de 2018 17:47

Respuestas

  • Hola Problema con Panel y backColor c sharp:

    La implementación más simple de esto puede ser tal que:

       public async Task asincronicoEjemplo()
            {
                var task1 = ejecutarAsync();
                var task2 = ejecutar2Async();
    
                await Task.WhenAll(task1, task2);
    /* El hilo principal que ha lanzado las tareas, se para en el await hasta que termina la ejecución, en este caso de las dos tareas, pues así se lo encarga WhenAll */
    
    /*salida de resultados */
                task1.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
                task2.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
            }
    
    /*cada método asincrono tiene que devolver un Task, pero puede devolver un Task <T>. En este caso devuelve una lista de strings */
            public Task<List<string>> ejecutarAsync()
            {
    /*El método invoca una ejecución de un método lambda que dentro define la llamada a un simple método síncrono, pues la ejecución se inicia mientras el hilo principal continua */
                return Task.Factory.StartNew(() =>
                {
    /*este método normalito, devuelve en si mismo la lista de strings que retorna el método async con task */
                    return ejecutarSincrono();
                });
            }
            
    /*Cuando se invoca este método, el hilo que ha iniciado el método uno no ha terminado, por tanto la ejecución ha inciado el mismo en paralelo, pero yo no tengo que preocuparme de nada, esto lo hace await */
            public Task<List<string>> ejecutar2Async()
            {
                return Task.Factory.StartNew(() =>
                {
                    return ejecutarSincrono2();
                });
            }
    
    
    /* mis metodos sincronos hacen algo */
            public List<string> ejecutarSincrono()
            {
                List<string> lista = new List<string>();
                lista.Add("juan");
                lista.Add("pedro");
                return lista;
            }
    
            public List<string> ejecutarSincrono2()
            {
                List<string> lista2 = new List<string>();
                lista2.Add("luis");
                lista2.Add("manolo");
                return lista2;
            }
    

    Espero te ayude un poco a comprender una de las implementaciónes más sencillas y eficaces de async y await.

    Es genial en si mismo, aunque cuando tengas algún problema, el trazado se vuelve algo más complicado.

    Un saludo

    lunes, 18 de junio de 2018 19:34

Todas las respuestas

  • Hace unos 4 años que no hago nada con async/await, pero hasta donde recuerdo, una función es awaitable si devuelve un Task.  Esto es porque la clase Task define el método GetAwaiter().  Si uno no desea usar Task como valor de retorno, entonces puede devolver algo más siempre y cuando tenga un método GetAwaiter(), ya sea declarado de forma explícita o como un método de extensión.

    Más allá de recomendarle que cambie sus tipos de retorno de sus funciones a Task, por ahora, no le recomendaré nada más.  Ah, cierto, una cosa más:  Para que un código pueda usar la palabra clave "await", necesita declararse con la palabra clave "async".  Y eso sería el requerimiento básico para async/await.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    lunes, 18 de junio de 2018 18:58
    Moderador
  • Hace unos 4 años que no hago nada con async/await, pero hasta donde recuerdo, una función es awaitable si devuelve un Task.  Esto es porque la clase Task define el método GetAwaiter().  Si uno no desea usar Task como valor de retorno, entonces puede devolver algo más siempre y cuando tenga un método GetAwaiter(), ya sea declarado de forma explícita o como un método de extensión.

    Más allá de recomendarle que cambie sus tipos de retorno de sus funciones a Task, por ahora, no le recomendaré nada más.  Ah, cierto, una cosa más:  Para que un código pueda usar la palabra clave "await", necesita declararse con la palabra clave "async".  Y eso sería el requerimiento básico para async/await.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    Bien entonces por lo pronto voy a probar de implementar que devuelvan task<objeto> para ver que sucede.

    gracias por la respuesta

    lunes, 18 de junio de 2018 19:22
  • Hola Problema con Panel y backColor c sharp:

    La implementación más simple de esto puede ser tal que:

       public async Task asincronicoEjemplo()
            {
                var task1 = ejecutarAsync();
                var task2 = ejecutar2Async();
    
                await Task.WhenAll(task1, task2);
    /* El hilo principal que ha lanzado las tareas, se para en el await hasta que termina la ejecución, en este caso de las dos tareas, pues así se lo encarga WhenAll */
    
    /*salida de resultados */
                task1.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
                task2.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
            }
    
    /*cada método asincrono tiene que devolver un Task, pero puede devolver un Task <T>. En este caso devuelve una lista de strings */
            public Task<List<string>> ejecutarAsync()
            {
    /*El método invoca una ejecución de un método lambda que dentro define la llamada a un simple método síncrono, pues la ejecución se inicia mientras el hilo principal continua */
                return Task.Factory.StartNew(() =>
                {
    /*este método normalito, devuelve en si mismo la lista de strings que retorna el método async con task */
                    return ejecutarSincrono();
                });
            }
            
    /*Cuando se invoca este método, el hilo que ha iniciado el método uno no ha terminado, por tanto la ejecución ha inciado el mismo en paralelo, pero yo no tengo que preocuparme de nada, esto lo hace await */
            public Task<List<string>> ejecutar2Async()
            {
                return Task.Factory.StartNew(() =>
                {
                    return ejecutarSincrono2();
                });
            }
    
    
    /* mis metodos sincronos hacen algo */
            public List<string> ejecutarSincrono()
            {
                List<string> lista = new List<string>();
                lista.Add("juan");
                lista.Add("pedro");
                return lista;
            }
    
            public List<string> ejecutarSincrono2()
            {
                List<string> lista2 = new List<string>();
                lista2.Add("luis");
                lista2.Add("manolo");
                return lista2;
            }
    

    Espero te ayude un poco a comprender una de las implementaciónes más sencillas y eficaces de async y await.

    Es genial en si mismo, aunque cuando tengas algún problema, el trazado se vuelve algo más complicado.

    Un saludo

    lunes, 18 de junio de 2018 19:34
  • Hola Problema con Panel y backColor c sharp:

    La implementación más simple de esto puede ser tal que:

       public async Task asincronicoEjemplo()
            {
                var task1 = ejecutarAsync();
                var task2 = ejecutar2Async();
    
                await Task.WhenAll(task1, task2);
    /* El hilo principal que ha lanzado las tareas, se para en el await hasta que termina la ejecución, en este caso de las dos tareas, pues así se lo encarga WhenAll */
    
    /*salida de resultados */
                task1.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
                task2.Result.ForEach(c => Console.Out.WriteLine(c.ToString()));
            }
    
    /*cada método asincrono tiene que devolver un Task, pero puede devolver un Task <T>. En este caso devuelve una lista de strings */
            public Task<List<string>> ejecutarAsync()
            {
    /*El método invoca una ejecución de un método lambda que dentro define la llamada a un simple método síncrono, pues la ejecución se inicia mientras el hilo principal continua */
                return Task.Factory.StartNew(() =>
                {
    /*este método normalito, devuelve en si mismo la lista de strings que retorna el método async con task */
                    return ejecutarSincrono();
                });
            }
            
    /*Cuando se invoca este método, el hilo que ha iniciado el método uno no ha terminado, por tanto la ejecución ha inciado el mismo en paralelo, pero yo no tengo que preocuparme de nada, esto lo hace await */
            public Task<List<string>> ejecutar2Async()
            {
                return Task.Factory.StartNew(() =>
                {
                    return ejecutarSincrono2();
                });
            }
    
    
    /* mis metodos sincronos hacen algo */
            public List<string> ejecutarSincrono()
            {
                List<string> lista = new List<string>();
                lista.Add("juan");
                lista.Add("pedro");
                return lista;
            }
    
            public List<string> ejecutarSincrono2()
            {
                List<string> lista2 = new List<string>();
                lista2.Add("luis");
                lista2.Add("manolo");
                return lista2;
            }

    Espero te ayude un poco a comprender una de las implementaciónes más sencillas y eficaces de async y await.

    Es genial en si mismo, aunque cuando tengas algún problema, el trazado se vuelve algo más complicado.

    Un saludo

    Muchas gracias a la noche pruebo y comento que tal me fue

    lunes, 18 de junio de 2018 19:49