Web应用程序任务并行线程

时间:2015-09-22 13:33:49

标签: c# asp.net task-parallel-library

我写了一个发送批量电子邮件的简单应用程序。它使用并行的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);
                                }

                            });




 }

0 个答案:

没有答案