删除MailMessage附件会导致网站挂起

时间:2014-11-14 16:23:58

标签: c# multithreading email mailmessage

我正在尝试异步发送包含附件的电子邮件。这些附件是动态生成并保存到服务器的,因此我希望在发送电子邮件后将其删除。

以下代码成功发送电子邮件,但之后整个网站都会锁定。我只能假设它无法删除已附加到电子邮件的生成文件,不会抛出任何错误并且不会发布日志。我知道文件路径是正确的,因为使用相同的路径将文件附加到电子邮件。注意我正在处理Message和Attachment对象。

在我的开发环境中,一切正常,但不适用于生产。应该注意的是,此代码是从放在网站bin文件夹中的.dll执行的。

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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

经过多次反复试验后,我解决了这个问题。事实证明,Attachments集合存在多线程问题。在新线程上调用以下内容:

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