MVC 异步任务消息 SmtpClient.Send 线程被中止

问题描述

我有一个 MVC .net framerowrk 4.5.2 站点,我想从我的数据库向 4000 多个收件人发送批量消息。因此,我开发了这种异步方法,以便用户继续使用该站点。几分钟后,我收到此错误 smtp.Send(mailMessage) 方法中的“线程正在被中止”,因此该过程将终止而不向所有收件人发送邮件消息。 这是我开发功能的方式

//首先是post方法

[HttpPost] [验证输入(假)] public ActionResult Index(SendEmailModel sendEmail,string CategoryID,string TemplateID) { var mailList = new List(); //这里有一些代码 进程 p = new Process(); p.Processstart = DateTime.Now; p.LogText = "进行中"; db.Process.Add(p); db.SaveChanges();

        if (ModelState.IsValid)
        {
            Task t = sendBulkMessages(mailList,sendEmail,path,unsubscribeUrl,p.ID,templatePath,TemplateID);

            ViewBag.Result = "Η διαδικασία ξεκίνησε,μεταβείτε στην ενότητα \"Αποστολές\" για να δείτε σε τι κατάσταση είναι";

        }
        //some code here
        return View();

    }

//调用异步方法 公共异步任务 sendBulkMessages(List emailcollection,SendEmailModel sendEmail,string uploadpath,string unsubscribeUrl,int processID,string templatePath,string TemplateID) { 等待 Task.Run(() => {

            string lastmail = "";
            try
            {
                //some code here
                    string Port = ConfigurationManager.AppSettings["Port"].ToString();

                    MailMessage mailMessage = new MailMessage();
                    mailMessage.From = new MailAddress(FormEmailId);

                    mailMessage.To.Add(new MailAddress(emailTo));


                    mailMessage.Subject = sendEmail.subject;
                    mailMessage.IsBodyHtml = true;
                    
                    if (sendEmail.file[0] != null)
                    {
                        DirectoryInfo d = new DirectoryInfo(Server.MapPath(uploadpath));

                        foreach (var file in d.GetFiles("*.*"))
                        {
                            mailMessage.Attachments.Add(new Attachment(file.FullName));
                        }
                    }
                    
                    mailMessage.AlternateViews.Add(view);

                    //mailMessage.Body = body;
                    SmtpClient smtp = new SmtpClient();
                    smtp.Host = HostAddress;
                    smtp.EnableSsl = true;
                    NetworkCredential networkCredential = new NetworkCredential();
                    networkCredential.UserName = mailMessage.From.Address;
                    networkCredential.Password = Password;
                    smtp.UseDefaultCredentials = true;
                    smtp.Credentials = networkCredential;
                    smtp.Port = Convert.ToInt32(Port);

                    try
                    {
                        smtp.Send(mailMessage);
                        Status f = new Status();
                        f.Email = emailTo;
                        f.StatusDatetime = DateTime.Now;
                        f.Message = "OK";
                        f.Statusflag = 1;
                        f.ProcessID = processID;
                        db.Status.Add(f);
                        db.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        Status f = new Status();
                        f.Email = emailTo;
                        f.StatusDatetime = DateTime.Now;
                        f.Message = ex.Message + "\n" + ex.StackTrace;
                        f.Statusflag = 2;
                        f.ProcessID = processID;
                        db.Status.Add(f);
                        db.SaveChanges();
                    }
                }
                Process p = db.Process.Find(processID);
                p.ProcessEnd = DateTime.Now;
                p.LogText = "Successfull process";
                db.Entry(p).State = EntityState.Modified;
                db.SaveChanges();
            }
            catch (Exception ex)
            {
                Process p = db.Process.Find(processID);
                p.ProcessEnd = DateTime.Now;
                p.LogText = "Mail: " + lastmail + "\nProcess ended with failure\n" + ex.Message + "\n" + ex.StackTrace;
                db.Entry(p).State = EntityState.Modified;
                db.SaveChanges();
            }
        });

    }

有什么想法可以避免中止线程吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)