Обработка ошибок 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);
}