none
Tareas asíncronas anidadas RRS feed

  • Pregunta

  • Hola Foro. No se si sea correcto el título, pero ya me corregirán. Estoy trabajando en una aplicación de consola en C# en Visual Studio Community 2017 Versión 15.9.5 que genera un archivo de Excel y se trabaja de forma exitosa realizándolo de la siguiente manera...

    static public void Main()

    {

    Metodo_1();

    Metodo_2();

    Metodo_3();

    CrearArchivo();

    }

    Cabe mencionar que los métodos 1-3 son procedimientos que se realizan antes de la creación del archivo de Excel, pero me gustaría realizar todo con tareas asíncronas para reducir el tiempo de ejecución del programa principal y lo he realizado de la siguiente forma...

    static public void Main()

    {

    tarea = new NotificarTarea<bool>(CrearArchivo());

    tarea.PropertyChanged += (sender, e) =>

    {

    variable = "Fin proceso";

    }

    }

    private Task<bool> CrearArchivo()

    {

    return Task.Run(async () =>

    {

    Task<bool> metodo1 = Metodo_1();

    Task<bool> metodo2 = Metodo_2();

    Task<bool> metodo2 = Metodo_3();

    bool resultadometodo1 = await metodo1;

    bool resultadometodo2 = await metodo2;

    bool resultadometodo3 = await metodo3;

    //Instrucciones para generar archivo Excel

    });

    }

    private async Task<bool> Metodo_1

    {

    //Instrucciones de método

    return true

    }

    private async Task<bool> Metodo_2

    {

    //Instrucciones de método

    return true

    }

    private async Task<bool> Metodo_3

    {

    //Instrucciones de método

    return true

    }

    En el menú principal la instrucción tarea = new NotificarTarea<bool>(CrearArchivo()); es para notificarme cuando la tarea CrearArchivo() termina, y dentro de esta tarea quiero que asíncronamente se ejecuten los métodos 1-3 y el método que genera el archivo de Excel, sin embargo, de esta manera ya no me genera el archivo. La duda que tengo es si es posible realizar de esta manera las tareas (por eso las llame anidadas, corrijanme si no debo llamarles así) o si tengo que trabajarlas de diferente manera para que se genere el archivo ya que como tengo mi código actualmente, no se genera.

    De antemano agradezco el apoyo. Espero me haya explicado correctamente y que puedan ayudarme


    martes, 13 de agosto de 2019 16:20

Todas las respuestas

  • hola

    No ganas nada si las tareas dependen una de otra, la unica diferencia quizas es que el thread principal no se bloque, pero en performance no vas a ver diferencia

    Si habre diferencia si puedes lanzar los 3 metodos en paralelo

    pero si pones el await despues de lanzar cada metodo va a esperar a que termine para lanzar el siguiente

    >>de esta manera ya no me genera el archivo.

    si lo ejecutas sincronamente si lo genera ? porque eso no es un problema  de asincronismo, quizas si defines algun try..catch no estes viendo el problema

    saludis


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 13 de agosto de 2019 16:32
  • Gracias por responder. Las tareas no dependen una de otra, lo que pretendo es lanzar las tareas una por una y que se vayan ejecutando asíncronamente para que cuando se vaya a generar el archivo, ya estén terminadas. ¿Para lanzar los métodos en paralelo, tendría que ser mediante threads?

    Si lo realizo de manera sincrona si lo genera, como tengo el código, es como si no esperara a que la tarea se terminara por completo y termina el programa, respecto al try, si los tengo en los métodos, solo los omití en el texto

    martes, 13 de agosto de 2019 16:46
  • Deleted
    martes, 13 de agosto de 2019 17:50
  • hola

    >>Las tareas no dependen una de otra, lo que pretendo es lanzar las tareas una por una

    ahh pero asi como lo programaste no tiene ese efecto, sino que ejecuta un metodo, termina, ejecute el siguiente, .... y sigue

    si lo haces asincronamente, pero se espera la respuesta para ejecutar el siguiente

    Programación asincrónica basada en tareas

    si analizas la documentacion veras que puedes crear un array de task que lanzas en paralelo y luego con el Task.WaitAll() esperas a que terminen

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 13 de agosto de 2019 17:53
  • Deleted
    miércoles, 14 de agosto de 2019 16:22