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.