No estoy seguro si lo siguiente es posible, pero me gustaría invocar una serie de Acciones, en Paralell, de una manera acelerada, pero mantenga el flujo de procesamiento continuo, sin volver a utilizar temporizadores o ciclos de bucle/reposo.¿Cómo puedo crear un "Flujo" de Procesamiento constante usando el TPL en C# 4
Hasta ahora lo he hecho funcionar que carga un lote grande de entradas de alguna fuente ... y luego las procesa en paralelo de manera controlada & en bucles como a continuación.
static void Main(string[] args)
{
while(true) //Simulate a Timer Elapsing...
{
IEnumerable<int> inputs = new List<int>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//Simulate querying database queue tables for next batch of entries
RunAllActions(inputs, 3); //Max 3 at a time.
}
}
static void RunAllActions(IEnumerable<int> inputs, int maxConcurrency)
{
var options = new ParallelOptions() {MaxDegreeOfParallelism = maxConcurrency};
Parallel.ForEach<int>(inputs, options, DoWork);
//Blocks here until all inputs are processed.
Console.WriteLine("Batch of Work Done!!!");
}
static void DoWork(int input)
{
Console.WriteLine("Starting Task {0}", input);
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Finishing Task {0}", input);
}
lo que me gustaría saber es, ¿Hay una construcción en el TPL que podría utilizar para mantenerlo siempre corriendo ... para que pueda reemplazar el "temporizador transcurrido" & "Sondeo de base de datos" con un evento recibido de MessageQueue.
La siguiente es una versión aproximada de lo que me gustaría lograr ... hay otras formas en que puedo hacerlo, pero quiero saber si este tipo de patrón está integrado en el TPL.
internal class Engine
{
private MessageQueue mq;
private Queue<int> myInternalApplicationQueue;
public Engine()
{
//Message Queue to get new task inputs from
mq = new MessageQueue();
mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
// internal Queue to put them in.
myInternalApplicationQueue = new Queue<int>();
}
void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
//On MQ Receive, pop the input in a queue in my app
int input = (int) e.Message.Body;
myInternalApplicationQueue.Enqueue(input);
}
public void StartWorking()
{
//Once this gets called, it doesn't stop... it just keeps processing/watching that queue
//processing the tasks as fast as it's allowed while the app is running.
var options = new ParallelOptions() { MaxDegreeOfParallelism = 3 };
Parallel.KeepWorkingOnQueue<int>(myInternalApplicationQueue, options, DoWork);
// ^^^^^^^^^^^^^^^^^^ <----- THIS GUY
}
}
Gracias Reed. Le vamos a dar una oportunidad. –