线程,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);

线程,c#中的Lambda

我建议使用任务,而不是线程,我很快就把一些东西放在一起来展示这个概念:

        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 ....

}