我有以下代码,每60秒向我们的收件人列表发送一批电子邮件。我不确定该怎么做才能到达线程的已完成部分,以便在完成后我可以记录发送了多少封电子邮件的最终状态。这是可能的lambda样式线程还是我必须做其他事情?感谢。
(new Thread(()=>
{
message.To.Clear();
var emailsToSend = memberlist.Skip(currentCount).Take(takeCount).ToList();
foreach (var email in emailsToSend)
{
message.To.Add(new MailAddress(email.Email));
//for logging purposes
campaign.SentTo.Add(new BroadcastEmailCampaignSentTo
{
MemberId = email.MemberId,
Email = email.Email,
DateSent = DateTime.Now
});
}
})).Start(pauseTime);
答案 0 :(得分:2)
我建议使用任务,而不是线程,我会迅速将一些东西放在一起以显示这个概念:
string[] emailsToSend = { "peter@test.com", "paul@test.com", "mary@test.com" };
List<Task> tasks = new List<Task>();
foreach (var email in emailsToSend) {
var e = email;
tasks.Add(Task.Factory.StartNew(() => { Console.WriteLine("Sending Email to {0}", e); Thread.Sleep(5000); }));
}
Task.Factory.ContinueWhenAll(tasks.ToArray(), (_) => { Console.WriteLine("All Emails sent!"); });
Console.ReadKey();
答案 1 :(得分:1)
我不确定该怎么做才能到达线程的已完成部分,以便在完成后我可以记录发送了多少封电子邮件的最终状态。
只需捕获一个变量并在lambda中将其变异。小心点如果您多次捕获它,则线程将共享相同的实例,并最终可能会相互遍历。您必须同步访问权限。
答案 2 :(得分:0)
只需在foreach:
之前将其添加到函数体内if (emailsToSend.Count == 0) {
// ok, finished sending,
// time to record the status here.
}
else {
foreach ....
}