这是我最近解决的一个问题,但是想知道是否有人可以帮我清楚这一点,因为我不完全明白究竟发生了什么。我创建了一个简单的smtp电子邮件客户端并将其包装在using语句中以处理它。在电子邮件中,我添加了一个PDF文件附件,这是我在运行中生成的。发送电子邮件后,我想销毁PDF,因为它暂时保存在本地机器上以便发送电子邮件。当File.Delete()方法运行时,我会得到IIS工作进程锁定文件的错误。我无法理解为什么在我尝试删除文件之前我的客户端已被处理掉了。最后我发现在删除文件之前我必须先处理附件。所以,我的问题是为什么不处理客户端也处理附件?不是客户的附件部分,因此一旦客户处置,它应该被处理掉吗?示例代码如下:
try
{
using (SmtpClient SmtpMail = new SmtpClient(""))
{
MailMessage message = new MailMessage(From, To, Subject, Body);
message.IsBodyHtml = false;
message.Priority = MailPriority.Normal;
Attachment attachment = new Attachment(pdfString);
message.Attachments.Add(attachment);
SmtpMail.Send(message);
attachment.Dispose(); //Why is this needed?
}
}
答案 0 :(得分:10)
SmtpClient的Send()
方法不是(并且不应该)负责处理MailMessage(及其相关资产)。 SmtpClient在发送后无法对MailMessage的预期用法做出假设。您可能希望继续使用MailMessage或附件流来执行其他操作。
让我们考虑多个SmtpClients将重用MailMessage实例的情况。
var message = new MailMessage();
using(var client1 = new SmtpClient())
{
client1.Send(message);
}
...
using(var client2 = new SmtpClient())
{
client2.Send(message);
}
如果在第一次通话后已经处理了message
个附件,则第二次通话将失败。
在第一次发送邮件之后,SmtpClient假设您已完成MailMessage,这是不正确的。 Send()
方法应该发送电子邮件,而不是发送并处理邮件资产。您的程序可能需要在程序后面的附件流中进一步工作。