C# 平行暂停。用于循环

C# 平行暂停。用于循环,c#,asp.net,parallel-processing,C#,Asp.net,Parallel Processing,我有一个嵌套的Parallel.For和Parallel.ForEach循环,它将向区块发送电子邮件。该列表可能超过10000封电子邮件,所以我决定将列表分成几个部分并发送出去。但我也希望能够在每次Parallel.For迭代后暂停。我一直在寻找一条路,但一无所获 if (Page.IsValid) { List<string> emailList; List<string> inva

我有一个嵌套的
Parallel.For
Parallel.ForEach
循环,它将向区块发送电子邮件。该列表可能超过10000封电子邮件,所以我决定将列表分成几个部分并发送出去。但我也希望能够在每次
Parallel.For
迭代后暂停。我一直在寻找一条路,但一无所获

if (Page.IsValid)
            {
                List<string> emailList;
                List<string> invalidList = new List<string> { };
                string[] attachments = { };
                if (rbListType.Items.FindByValue("CSV").Selected)
                {
                    emailList = tbEmailTo.Text.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    int count = 0;
                    int total = emailList.Count;
                    RadRadialGauge1.Scale.Max = total;
                    RadRadialGauge1.Scale.Min = 0;
                    var errorList = new ConcurrentBag<string>();
    var chunk = emailList
        .Select((value, index) => new { Index = index, Value = value })
        .GroupBy(x => x.Index / 2)
        .Select(g => g.Select(x => x.Value).ToList())
        .ToList();



    Parallel.For(0, chunk.Count, i =>
    {
        Parallel.ForEach(chunk[i], email =>
        {
            try
            {
                MailMessage em = new MailMessage();
                em.From = new MailAddress(tbEmailFrom.Text);
                em.To.Add(email.ToString());

                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;
                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 />");
            }
        });  
     });
if(Page.IsValid)
{
列表电子邮件列表;
列表无效列表=新列表{};
字符串[]附件={};
if(已选择rbListType.Items.FindByValue(“CSV”))
{
emailList=tbEmailTo.Text.Split(新字符串[]{,“},StringSplitOptions.RemoveEmptyEntries.ToList();
整数计数=0;
int total=emailList.Count;
RadRadialGauge1.Scale.Max=总计;
RadRadialGauge1.Scale.Min=0;
var errorList=新的ConcurrentBag();
var chunk=emailList
.Select((值,索引)=>new{index=index,value=value})
.GroupBy(x=>x.Index/2)
.Select(g=>g.Select(x=>x.Value).ToList())
.ToList();
Parallel.For(0,chunk.Count,i=>
{
Parallel.ForEach(chunk[i],email=>
{
尝试
{
MailMessage em=新的MailMessage();
em.From=新邮件地址(tbEmailFrom.Text);
em.To.Add(email.ToString());
如果(!String.IsNullOrEmpty(tbEmailCC.Text))
{
em.CC.Add(tbEmailCC.Text);
}
如果(!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;
SmtpClient sm=新的SmtpClient();
if(String.IsNullOrEmpty(smtpServer))
{
sm.Host=Host.SMTPServer;
}
其他的
{
sm.UseDefaultCredentials=false;
sm.Host=smtpServer;
sm.Credentials=new System.Net.NetworkCredential(smtpUsername,smtpPassword);
}
sm.Send(em);
联锁增量(参考计数);
}
捕获(SmtpException smtp)
{
errorList.Add(email.ToString()+“
”); } }); });
为什么需要暂停?特别是你想通过暂停实现什么?所以我不会让我们的电子邮件服务器过载,那么你为什么不为循环执行一个非并行的
?在运行它时,这是否真的会导致错误?你应该受到线程池提供给你的线程数量的限制。我先尝试了,但没有n联锁增量(参考计数)出现问题;什么类型的问题?