我写了一个发送批量电子邮件的简单应用程序。它使用并行的foreach循环通过system.net.mail发送电子邮件。并行的foreach循环被for循环包围,该循环将15000个电子邮件列表分成20个,每个由sl.sleep等待1秒。我在web配置中将executiontimeout设置为7200。这个应用程序应该在一小时内完成。我的问题是 - 为什么申请需要一个多小时才能完成。是等待线程完成还是什么?我怎么能让它停下来?它最终通过另一个计时器超时 - 但???我是线程新手 - 我很难试着绕过这个。
var chunk = emailList.Select((value, index) => new { Index = index, Value = value })
.GroupBy(x => x.Index / Convert.ToInt32(chunkSize))
.Select(g => g.Select(x => x.Value).ToList())
.ToList();
for (int i = 0; i < chunk.Count; i++)
{
if (i > 0)
{
if (!String.IsNullOrEmpty(waitTime))
{
//mre.WaitOne(Convert.ToInt32(waitTime));
//mre.Reset();
Thread.Sleep(Convert.ToInt32(waitTime));
}
}
Parallel.ForEach(chunk[i], email =>
{
try
{
MailMessage em = new MailMessage();
em.From = new MailAddress(tbEmailFrom.Text);
em.To.Add(email.ToString().Trim());
if (!String.IsNullOrEmpty(tbEmailCC.Text))
{
em.CC.Add(tbEmailCC.Text);
}
if (!String.IsNullOrEmpty(tbEmailBC.Text))
{
em.Bcc.Add(tbEmailBC.Text);
}
em.ReplyToList.Add(tbReplyTo.Text);
em.Body = tbEmailBody.Text;
em.IsBodyHtml = true;
em.Subject = tbSubject.Text;
em.Priority = System.Net.Mail.MailPriority.Normal;
em.BodyEncoding = System.Text.Encoding.UTF8;
using (SmtpClient sm = new SmtpClient())
{
if (String.IsNullOrEmpty(smtpServer))
{
sm.Host = Host.SMTPServer;
}
else
{
sm.UseDefaultCredentials = false;
sm.Host = smtpServer;
sm.Credentials = new System.Net.NetworkCredential(smtpUsername, smtpPassword);
}
sm.Send(em);
}
Interlocked.Increment(ref count);
}
catch (SmtpException smtp)
{
errorList.Add(email.ToString() + "<br />");
}
catch (Exception ex)
{
errorList.Add(email.ToString() + "<br />");
Exceptions.LogException(ex);
}
});
}