Usuario
Tareas asíncronas anidadas

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
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- Propuesto como respuesta Pablo RubioModerator miércoles, 14 de agosto de 2019 15:12
-
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
-
-
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- Editado Leandro TuttiniMVP martes, 13 de agosto de 2019 17:55
- Propuesto como respuesta Pablo RubioModerator miércoles, 14 de agosto de 2019 15:12
-