我正在尝试异步发送包含附件的电子邮件。这些附件是动态生成并保存到服务器的,因此我希望在发送电子邮件后将其删除。
以下代码成功发送电子邮件,但之后整个网站都会锁定。我只能假设它无法删除已附加到电子邮件的生成文件,不会抛出任何错误并且不会发布日志。我知道文件路径是正确的,因为使用相同的路径将文件附加到电子邮件。注意我正在处理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);
}
}
}
答案 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