私は、Task内でParallel.ForEachを実行しています。メールアドレスのコレクションを繰り返し処理し、MailMessageをSMTPキューに送信します。送信されると、結果はDB内のテーブルを更新します。Parallel.ForEachコレクションの項目を複数回反復する
私は、MailMessageをキューに複数回、時には最大6回送信していることがDBで分かります。ここでは私の単純化されたコードは、誰もが良いアプローチをお勧めしますか?ボタンのクリックで
、私はこれは、基本的には加入者のConcurrentBagを取得するタスク、(カスタムクラス)を作成し、コレクションを反復処理し、メッセージを送信し
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.");
}
...新しいタスクを作成します。.. 。
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
}
IはConcurrentBagさんは、スレッドセーフであるので、それがコレクション内にいくつかの上に複数回反復されるだろう、なぜ私はよく分からないことを信じるように導かいます。 1000のうち、コレクションの10%に対して少なくとも2つのメッセージがキューに入れられます。ありがとう、
Greg。
私はなぜあなたがタスク内で並列を産んでいるのか分かりません。なぜタスクなしでやっていないだけでなく、broadcastService.BroadcastCampaign();を呼び出す –
私はそこにタスクを持っています。最終的には、一度Parallel.ForEach内で仕事をしてしまえば、数秒ごとにブロードキャストサービスを起動するWindowsサービスになります。明らかに仕事が必要です。それはタスクの中で実行されていたのであって、最終コードではありませんでした。 – gfyans