穿线& lambda in c#

时间:2011-07-24 20:21:52

标签: c# asp.net multithreading

我有以下代码,每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);

3 个答案:

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


}