2014-11-14 2 views
0

Я пытаюсь отправить асинхронное письмо с прикрепленными файлами. Эти вложения создаются «на лету» и сохраняются на сервере, поэтому я хотел бы удалить их после отправки письма.Удаление вложений MailMessage приводит к зависанию веб-сайта

Приведенный ниже код успешно отправляет электронное письмо, однако после этого весь сайт блокируется. Я могу только предположить, что он не может удалить сгенерированный файл, который был прикреплен к электронной почте, никаких ошибок не выбрасывается и журналы не публикуются. Я знаю, что путь к файлу верен, так как тот же путь используется для присоединения файла к письму. Примечание. Я удаляю объекты Message и Attachment.

Все работает отлично в моей среде разработки, но не на производстве. Следует отметить, что этот код выполняется из .dll, который помещается в папку bin на веб-сайте.

ThreadStart starter = delegate { SendAsync(ref message, Attachments, Settings); }; 
Thread thread = new Thread(starter); 
thread.IsBackground = true; 
thread.Start(); 

private static void SendAsync(ref MailMessage Message, List<clsEmailAttachment> Attachments, clsSmtpSettings Settings) 
{ 
    try 
    { 
     SmtpClient smtp = new SmtpClient(); 
     smtp.Host = Settings.Host; 
     NetworkCredential Credential = new NetworkCredential(Settings.Username, Settings.Password, Settings.Domain); 
     smtp.UseDefaultCredentials = false; 
     smtp.Credentials = Credential; 
     smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
     smtp.Send(Message); 
    } 
    catch (Exception SendingEmailException) 
    { 
     Log.PostLog(null, 4007, SendingEmailException.Message); 
    } 
    finally 
    { 
     try 
     { 
      Message.Attachments.Dispose(); 
      Message.Dispose(); 
      foreach (clsEmailAttachment attachment in Attachments) 
      { 
       if (attachment.Delete == true) 
       { 
        try 
        { 
         File.Delete(attachment.Path); 
        } 
        catch { throw; } 
       } 
      } 
     } 
     catch (Exception DeletingAttachmentsException) 
     { 
      Log.PostLog(null, 4008, DeletingAttachmentsException.Message); 
     } 
    } 
} 
+0

вы пробовали отладки это? Каково значение 'attachment' в цикле' foreach'? – Ckrempp

ответ

0

После долгих проб и ошибок я решил проблему. Оказывается, это многопоточная проблема с коллекцией вложений. Вызывается в новом потоке следующее:

private static void SendAsync(ref MailMessage Message, List<clsEmailAttachment> Attachments, clsSmtpSettings Settings) 

Generic.List<type> является не поточно коллекция. Следующая инструкция берется из сообщения msdn:

Классы коллекции, представленные в .NET Framework 2.0, находятся в пространстве имен System.Collections.Generic. К ним относятся List, Dictionary и т. Д. Эти классы обеспечивают повышенную безопасность и производительность по сравнению с классами .NET Framework 1.0. Однако классы коллекции .NET Framework 2.0 не обеспечивают ни одной синхронизации потоков; код пользователя должен обеспечивать всю синхронизацию при добавлении или удалении элементов одновременно.

Смотрите здесь Full article

 Смежные вопросы

  • Нет связанных вопросов^_^