Tengo un Parallel.ForEach ejecutándose dentro de una Tarea. Se itera sobre una colección de direcciones de correo electrónico y envía un MailMessage a la cola SMTP, una vez que se envía actualiza una tabla en el DB con un resultado.Parallel.ForEach iterando elementos en la colección varias veces
Puedo ver en la base de datos que está enviando el MailMessage a la cola varias veces, a veces hasta 6 veces. Aquí está mi código simplificado, ¿alguien puede recomendar un mejor enfoque?
El botón de clic, que crea una nueva tarea ...
CampaignManager.Broadcast.BroadcastService broadcastService = new CampaignManager.Broadcast.BroadcastService();
var task = Task<CampaignManager.Broadcast.Results.Broadcast>.Factory.StartNew(() => {
return broadcastService.BroadcastCampaign();
}, TaskCreationOptions.LongRunning);
Task.WaitAny(task);
if (task.Result != null)
{
Broadcast.Results.Broadcast broadcastResult = task.Result;
MessageBox.Show(broadcastResult.BroadcastSent.GroupName + " completed. " + broadcastResult.NumberSuccessful + " sent.");
}
Esto crea una tarea, que básicamente consigue un ConcurrentBag de abonados (clases personalizadas), itera sobre la colección y envía un mensaje .. .
public Results.Broadcast BroadcastCampaign()
{
// Get ConcurrentBag of subscribers
subscribers = broadcast.GetSubscribers();
// Iterate through subscribers and send them a message
Parallel.ForEach(subscribers, subscriber =>
{
// do some work, send to SMTP queue
// Add to DB log
});
// return result
}
me lleva a creer que son de ConcurrentBag flujos seguros, así que no estoy seguro de por qué estaría interactuando sobre varios de la colección varias veces. De mil, cola al menos 2 mensajes para el 10% de la colección.
Gracias,
Greg.
No entiendo por qué está generando un paralelo dentro de una tarea. ¿Por qué no simplemente prescindir de la tarea y llamar a broadcastService.BroadcastCampaign() ;? –
Tengo la Tarea allí porque eventualmente, una vez que tenga el trabajo dentro de Parallel.ForEach trabajando perperly, se convertirá en un servicio de Windows con broadcastService que se dispara cada pocos segundos, obviamente necesita algo de trabajo, simplemente lo puse allí para mostrarle que se estaba ejecutando dentro de una Tarea, no es que fuera el código final. – gfyans