线程,c#中的Lambda
本文关键字:Lambda 中的 线程 | 更新日期: 2023-09-27 18:03:37
我有以下代码,每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);
我建议使用任务,而不是线程,我很快就把一些东西放在一起来展示这个概念:
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();
我不确定如何做的是得到线程的完成部分,这样当它完成时,我可以记录发送了多少电子邮件的最终状态。
只需捕获一个变量并在lambda中对其进行变异。小心点。如果多次捕获它,线程将共享同一个实例,最终可能会相互遍历。您必须同步访问
只需将其添加到函数体中,在foreach之前:
if (emailsToSend.Count == 0) {
// ok, finished sending,
// time to record the status here.
}
else {
foreach ....
}