Обработка ошибок asp.net при сочетании Task.Factory.StartNew с параллельным программированием

Я создаю приложение ASP.net для отправки массовых писем, оно помещает электронные письма прямо в локальную очередь SMTP. Я могу поместить тысячи писем в очередь всего за пару секунд, НО, что-то идет не так, когда я добавляю, скажем, вложение размером 2 МБ. Размещение 1000 писем с вложением 2 МБ в очереди занимает примерно 30-35 секунд, и если я поднимусь, у меня будет тайм-аут.

Я не хочу действительно увеличивать время ожидания, поэтому вместо этого я выбрал Task.factory.Startnew. Это, конечно, сохраняет пользовательский интерфейс, но я, похоже, теряю контроль над обработкой ошибок, AggregateException, просто потому, что он выполняется в отдельной задаче.

Вся помощь очень ценится!

Есть ли другой способ предотвратить тайм-аут интерфейса?

        try
        {
            SendParallel(Recip, address, displayName);
            //Task.Factory.StartNew(() => SendParallel(Recip, address, displayName));
        }
        catch (AggregateException ae)
        {
            foreach (var ex in ae.InnerExceptions)
            {
                mailErrors += 1;
                errors += ex.Message + "<br/>";
            }
        }

    private void SendParallel(List<string> Recipients, string address, String displayName)
    {
        var exceptions = new ConcurrentQueue<Exception>();
        Parallel.ForEach(Recipients, r =>
        {
            try
            {
                using (MailMessage mailMessage = new MailMessage())
                {
                    mailMessage.From = new MailAddress(address, displayName);
                    mailMessage.Body = tinymce.Text;
                    mailMessage.IsBodyHtml = true;
                    mailMessage.Subject = Onderwerp.Text;
                    mailMessage.To.Add(r);
                    mailMessage.Attachments.Clear();
                    foreach (string fn in AttachmentList)
                    {
                        Attachment attach = new Attachment(Server.MapPath("~/uploads/") + fn);
                        mailMessage.Attachments.Add(attach);
                    }
                    using (SmtpClient smtpClient = new SmtpClient("localhost", 25))
                    {
                        smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                        smtpClient.PickupDirectoryLocation = @"C:\inetpub\mailroot\Pickup";
                        smtpClient.Send(mailMessage);
                    }
                }
            }
            catch (Exception e)
            {
                exceptions.Enqueue(e);
            }
        });
        if (exceptions.Count > 0) throw new AggregateException(exceptions);
    }

0 ответов

Другие вопросы по тегам