Saltar al contenido

c# construye una lista de tareas antes de ejecutar

Luego de consultar con especialistas en este tema, programadores de deferentes ramas y profesores dimos con la solución a la pregunta y la compartimos en esta publicación.

Solución:

Bueno, otro enfoque, (que me parece muy directo)

        var list = new List();
        for (var i = 0; i < 10; ++i)
        
            var i2 = i;
            var t = new Task(() =>
                
                    Thread.Sleep(100);
                    Console.WriteLine(i2);
                );
            list.Add(t);
            t.Start();
        

        Task.WaitAll(list.ToArray());

En lugar de usar Task.Factory.StartNew para crear las tareas (la pista está en el nombre), en lugar de eso, simplemente créelas usando new Task(...) con sus lambdas, simplemente use taskName.Start() dentro de la condición que desea iniciarlos.

Puedes crear un array de Action basado en una bandera, y luego use Parallel.Invoke() para ejecutar en paralelo todas las acciones en el array y esperar a que terminen.

Puede usar lambdas para las acciones que le permitirán asignar sus valores de retorno a una variable local, si lo desea.

Aquí hay un ejemplo compilable completo. Pruébalo con getFlag() regresando true y otra vez con ella regresando false:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1

    sealed class Program
    
        void run()
        
            bool flag = getFlag();
            var results = new string[5];
            Action[] actions;

            if (flag)
            
                actions = new Action[]
                
                    () => results[0] = function("f1"),
                    () => results[1] = function("f2"),
                    () => results[2] = function("f3")
                ;
            
            else
            
                actions = new Action[]
                
                    () => results[3] = function("f4"),
                    () => results[4] = function("f5")
                ;
            

            Parallel.Invoke(actions); // No tasks are run until you call this.

            for (int i = 0; i < results.Length; ++i)
                Console.WriteLine("Result 0 = 1", i, results[i]);
        

        private bool getFlag()
        
            return true; // Also try with this returning false.
        

        string function(string param)
        
            Thread.Sleep(100); // Simulate work.
            return param;
        

        static void Main(string[] args)
        
            new Program().run();
        
    

Si te sientes incitado, tienes la habilidad dejar una crónica acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *