none
Como saber el progreso de task en async? RRS feed

  • Pregunta

  • Buenas, estoy probando Async y Await. Pude hacer una pequeña aplicación que ejecuta dos Thread.Sleep() de manera asíncrona, el primero durante 5 segundos y el segundo durante 10 segundos, luego de cada Sleep() cada método tiene una instrucción que cambia un texto en el formulario para indicar que hizo tal tarea. A este formulario le agregue un ProgressBar y por parámetros le pase un Iprogress. Luego en los métodos que se ejecutan de manera asíncrona reporto el progreso llamando a .Report() y este se refleja en el ProgressBar. Sin embargo este requiere un valor, el cual por ahora le estoy definiendo manualmente. Le he colocado para el método que ejecuta el Thread.Sleep durante 5 segundos un 50 y al otro de 10 segundos un 100 lo que equivale a 50% y 100%.

    Esto funciona, al ejecutar la aplicación y finalizar cada tarea el ProgressBar muestra el progreso. Sin embargo me gustaría ver el progreso por instrucción en el Task y no encuentro como hacerlo. He visto que en Internet aplican un For() que al repetir ciclo notifica el progreso con .Report() y este va aumentando por cada ciclo hasta el 100%, sin embargo este no me sirve porque usa un bucle para repetir la tarea, lo que quiero es reportar el progreso de cada instrucción que se ha llevado a cabo en el método y que el ProgressBar vaya aumentando con cada instrucción completada. Alguien sabe como?


    miércoles, 8 de enero de 2020 20:54

Respuestas

  • hola

    >>me gustaría ver el progreso por instrucción en el Task y no encuentro como hacerlo

    no se puede si es que ese proceso no da feeback del avance que realiza

    Si le has puesto un Sleep entonces quiere decir que queda alli hasta que despierta y continua

    lo que puedes hacer es poner el Progress como Marquee y una velocidad para indicar trabajo pero no vas a poder reflejar un avance real

    ProgressBar1.MarqueeAnimationSpeed = 30;
    ProgressBar1.Style = ProgressBarStyle.Marquee;


    Salvo que quites el sleep y pongas algun evento que este indicando cuanto falta para completar y esto sirva para saber internamente como esta avanzando

    Sucede lo mismo cuando haces una consulta a una db, no tienes un indicador de cuanto va a demorar por eso se lanza asincrono y lo mejor que puedes lograr es indicar que se esta procesanso pero no sabras realmente cuanto le tomara completar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 8 de enero de 2020 21:54
    • Marcado como respuesta aloaizar miércoles, 8 de enero de 2020 21:56
    miércoles, 8 de enero de 2020 21:53

Todas las respuestas

  • hola

    >>me gustaría ver el progreso por instrucción en el Task y no encuentro como hacerlo

    no se puede si es que ese proceso no da feeback del avance que realiza

    Si le has puesto un Sleep entonces quiere decir que queda alli hasta que despierta y continua

    lo que puedes hacer es poner el Progress como Marquee y una velocidad para indicar trabajo pero no vas a poder reflejar un avance real

    ProgressBar1.MarqueeAnimationSpeed = 30;
    ProgressBar1.Style = ProgressBarStyle.Marquee;


    Salvo que quites el sleep y pongas algun evento que este indicando cuanto falta para completar y esto sirva para saber internamente como esta avanzando

    Sucede lo mismo cuando haces una consulta a una db, no tienes un indicador de cuanto va a demorar por eso se lanza asincrono y lo mejor que puedes lograr es indicar que se esta procesanso pero no sabras realmente cuanto le tomara completar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 8 de enero de 2020 21:54
    • Marcado como respuesta aloaizar miércoles, 8 de enero de 2020 21:56
    miércoles, 8 de enero de 2020 21:53
  • Muchas gracias leandro, ya me lo me imaginaba.
    miércoles, 8 de enero de 2020 21:56