在对IDisposable的引用上调用dispose()

Phi*_*idt 1 c# email idisposable attachment

我有一些代码来添加电子邮件的附件.我是通过类构造函数的Stream重载添加它们的Attachment.执行此操作的代码如下所示:

List<UploadedDocument> docs = DataBroker.GetUploadedDocs(Convert.ToInt32(HttpContext.Current.Session["offer_id"].ToString()));
//no need to keep this in session
HttpContext.Current.Session["offer_id"] = null;
int counter = 1;
foreach (UploadedDocument doc in docs)
{
    stream = new MemoryStream(doc.doc);
    attach = new Attachment(stream, "Attachment-" + counter.ToString());
    message.Attachments.Add(attach);              
}
Run Code Online (Sandbox Code Playgroud)

doc.doc字节数组在哪里.我想正确处理每一个附件和流的,但我不能这样做,直到该消息已发送,所以我想只是将其添加到List<Attachment>List<Stream>,然后通过迭代和呼叫处理.

像这样的东西:

List<Attachment> attachments;
List<Stream> streams;
//...
foreach(UploadedDocument doc in docs)
{
    stream = new MemoryStream(doc.doc);
    streams.Add(stream);
    attach = new Attachment(stream,"Name");
    attachments.Add(attach);
    message.Attachments.Add(attach);
}
//other processing
emailClient.Send(message);

if(attachments != null)
{
    foreach(Attachment attachment in attachments)
    {
        attachment.Dispose();
    }
}
if(streams != null)
{
    foreach(MemoryStream myStream in streams)
    {
        myStream.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

但有些东西告诉我,如果仍然有一个没有收集垃圾或其他东西的参考,那么就不会正确处理它们.有什么想法吗?

Ree*_*sey 5

处理这个问题最简单的方法就是调用Dispose()MailMessage.

MailMessage.Dispose将自动处理所有附件,这些附件将关闭/ Dispose()所有底层流.

//other processing
emailClient.Send(message);
message.Dispose();  // Or just wrap this entire block in a using statement
Run Code Online (Sandbox Code Playgroud)