我有一个在任务内运行的Parallel.ForEach。它遍历一组电子邮件地址并向SMTP队列发送一个MailMessage,一旦它发送,它就会更新数据库中的一个表格并显示结果。Parallel.ForEach多次迭代集合中的项
我可以在数据库中看到它将多次发送MailMessage到队列,有时最多6次。这里是我的简化代码,任何人都可以推荐更好的方法吗?
在按一下按钮,我创建了一个新的任务......
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.");
}
这将创建一个任务,这基本上得到用户(定制类),在集合迭代的ConcurrentBag和发送的短信.. 。
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
}
导致我相信ConcurrentBag的是线程安全的,所以我不知道为什么它会遍历一些在收集多次。在一千个中,它会为该集合的10%排队至少2条消息。
谢谢,
Greg。
我不明白你为什么在任务中产生一个并行。为什么不只是没有任务,并调用broadcastService.BroadcastCampaign();? –
我有这个任务,因为最终,一旦我在Parallel.ForEach内部正常工作,它将成为一个Windows服务,每隔几秒发送一次broadcastService,它显然需要一些工作,我只是把它放在那里以向你展示它在Task内部运行,而不是它是最终的代码。 – gfyans