这是我最近解决的一个问题,但想知道是否有人可以帮我解决这个问题,因为我不完全了解到底发生了什么。我创建了一个简单的 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?
}
}
请您参考如下方法:
SmtpClient 的 Send() 方法不(也不应该)负责处理 MailMessage(及其相关 Assets )。 SmtpClient 无法假设您在发送 MailMessage 后的预期用途。您可能希望继续使用 MailMessage 或附件流来做其他事情。
让我们考虑一个 MailMessage 实例将被多个 SmtpClient 重复使用的情况。
var message = new MailMessage();
using(var client1 = new SmtpClient())
{
client1.Send(message);
}
...
using(var client2 = new SmtpClient())
{
client2.Send(message);
}
如果消息的附件在第一次调用后已经处理完毕,则第二次调用将失败。
让 SmtpClient 假设您在第一次发送 MailMessage 后就完成了它是不正确的。 Send() 方法应该发送电子邮件,而不是发送并处理消息 Assets 。您的程序可能需要在程序的后面对附件流做进一步的工作。
