2011-07-24 30 views
2

我有下面的代碼,它每隔60秒向我們的收件人列表發送一批電子郵件。我不知道該怎麼做才能到達線程的完成部分,以便完成後我可以記錄發送郵件的最終狀態。這是可能的lambda風格的線程或我必須做別的嗎?謝謝。c中的線程和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); 

回答

1

我不知道怎麼做的就是得到的線程完成了一部分,這樣當它這樣做我可以記錄有多少郵件被送到最終狀態。

只需捕獲一個變量並在lambda中進行變異即可。小心一點。如果你多次捕獲它,這些線程將共享相同的實例,並最終可能走完彼此。你將不得不同步訪問。

+0

我會確保你同步訪問所述變量。 – ChaosPandion

0

就在函數體裏面添加這個,在foreach前:

if (emailsToSend.Count == 0) { 
    // ok, finished sending, 
    // time to record the status here. 
} 
else { 
    foreach .... 


} 
+0

我意識到我只是讓我的線程設置錯了。謝謝您的幫助。 –

+0

如果我在我的線程中設置了一個變量,它決定了我們是否完成了發送,然後在線程體的主要部分的while循環中使用它 - while(!sendingComplete){do stuff},那麼我假設它一退出while循環就結束了線程?還是有什麼我需要做的專門殺死線程?謝謝 –

2

我會建議使用的任務,不是線程,我扔東西一起迅速展現的概念:

 string[] emailsToSend = { "[email protected]", "[email protected]", "[email protected]" }; 

     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();