Bir Görev içinde çalışan bir Parallel.ForEach var. Bir e-posta adresi koleksiyonu üzerinde yinelenir ve SMTP kuyruğuna bir MailMessage gönderir, gönderildikten sonra DB'deki bir tabloyu sonuç olarak günceller.Parallel.ForEn fazla sayıda öğeyi koleksiyonda yineleme Yineleme
DB'de MailMessage'ı sıraya, bazen 6 kata kadar çok kez gönderdiğinizi görebiliyorum. İşte basitleştirilmiş kodum, daha iyi bir yaklaşım önerebilir misiniz?
düğmesi tıklandığında, ben
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.");
}
Bu temelde abonelerin (özel sınıf), koleksiyonu üzerinde dolaşır bir ConcurrentBag alır ve bir mesaj gönderir bir görev oluşturur ... Yeni bir Görev oluşturmak .. .
Ben ConcurrentBag en evreli vardır, bu nedenle toplama birden çok kez bazı yineleme nedenlerine emin değilim o inanıyoruz yolpublic 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
}
. Binden azı, koleksiyonun% 10'u için en az 2 mesajını sıraya koyar.
sayesinde
Greg.
Neden bir görev için neden bir paralel oluşturuyorsunuz anlamıyorum. Neden sadece görev olmadan yapmak ve broadcastService.BroadcastCampaign() ;? –
Orada Görevim var, sonuçta, bir kez Parallel.ForEach içinde çalışmak zorunda kaldıktan sonra, yayın hizmeti birkaç saniyede bir ateşleme ile bir Windows servisi olacak, belli ki bir işe ihtiyaç duyuyor, sadece size göstermek için oraya koydum. Görev içinde koşuyordu, son kod buydu. – gfyans