C# 为什么SMTP邮件附件在客户端处理时不处理?

C# 为什么SMTP邮件附件在客户端处理时不处理?,c#,C#,这是我最近解决的一个问题,但我想知道是否有人能帮我澄清这一点,因为我不完全了解到底发生了什么。我创建了一个简单的smtp电子邮件客户端,并将其包装在一个using语句中进行处理。在电子邮件中,我添加了一个PDF文件附件,这是我动态生成的。一旦发送电子邮件,我想销毁PDF,因为它是临时保存在本地机器上,以便发送电子邮件。当File.Delete方法运行时,我会得到一个错误,即IIS工作进程正在锁定该文件。我不明白为什么,因为在我试图删除文件之前,我的客户已经被处理掉了。最后,我发现在删除该文件之前

这是我最近解决的一个问题,但我想知道是否有人能帮我澄清这一点,因为我不完全了解到底发生了什么。我创建了一个简单的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及其相关资产。SmtpClient无法在邮件消息发送后对您的预期用途做出假设。您可能希望继续使用MailMessage或附件流执行其他操作

让我们考虑一个邮件消息实例将被多个SMTPclipse重新使用的情况。

var message = new MailMessage();

using(var client1 = new SmtpClient())
{
    client1.Send(message);
}

...

using(var client2 = new SmtpClient())
{
    client2.Send(message);
}
如果邮件的附件在第一次调用后已被释放,则第二次调用将失败

如果SmtpClient认为您在第一次发送邮件消息后就已经处理完邮件消息,这是不正确的。Send方法应发送电子邮件,而不是发送,并处置邮件资产。您的程序以后可能需要对附件流进行进一步的处理。

SmtpClient的Send方法不负责也不应该负责处理MailMessage及其相关资产。SmtpClient无法在邮件消息发送后对您的预期用途做出假设。您可能希望继续使用MailMessage或附件流执行其他操作

让我们考虑一个邮件消息实例将被多个SMTPclipse重新使用的情况。

var message = new MailMessage();

using(var client1 = new SmtpClient())
{
    client1.Send(message);
}

...

using(var client2 = new SmtpClient())
{
    client2.Send(message);
}
如果邮件的附件在第一次调用后已被释放,则第二次调用将失败


如果SmtpClient认为您在第一次发送邮件消息后就已经处理完邮件消息,这是不正确的。Send方法应发送电子邮件,而不是发送,并处置邮件资产。您的程序可能需要在稍后的程序中进一步处理附件流。

在StackOverflow上最好问这样的问题。您能解释一下原因吗?我不是在问代码问题的答案,我是在问代码背后的理论。在StackOverflow上问这样的问题会更好。你能解释一下为什么吗?我不是在问代码问题的答案,我是在问代码背后的理论。