C#List <Stream> dispose/close

Pet*_*teT 6 c# stream

我正在建立一个订阅服务,按时间表向我们公司的各个人发送报告.我打算通过电子邮件发送报告,我正在使用的报告系统能够导出为PDF流(而不是编写临时文件).大多数人会收到多个报告,所以我试图将它们全部附加到一封电子邮件中

List<Stream> reports = new List<Stream>();
//looping code for each users set of reports
Stream stream = ReportSource.ReportDocument.ExportToStream(PortableDocFormat)
reports.Add(stream);
stream.Flush();  //unsure
stream.Close();  //unsure
//end looping code

SmtpClient smtpClient = new SmtpClient(host, port);
MailMessage message = new MailMessage(from, to, subject, body);

foreach (Stream report in reports)
{
    message.Attachments.Add(new Attachment(report, "application/pdf"));
}                
smtpClient.Send(message);
Run Code Online (Sandbox Code Playgroud)

我不确定的是,我应该在将流添加到列表之后刷新并关闭流,这样可以吗?或者我之后是否需要循环列表以进行刷新和处理?我试图避免任何可能的内存泄漏.

mke*_*bbs 20

为什么不创建实现IDisposable的StreamCollection类:

public class StreamCollection : Collection<Stream>, IDisposable { }
Run Code Online (Sandbox Code Playgroud)

在该类的Dispose方法中,您可以循环遍历所有流并正确关闭/处理每个流.然后你的代码看起来像:

using (var reports = new StreamCollection())
{
   //looping code for each users set of reports
   reports.Add(ReportSource.ReportDocument.ExportToStream(PortableDocFormat));
   //end looping codeSmtpClient 

   smtpClient = new SmtpClient(host, port);
   MailMessage message = new MailMessage(from, to, subject, body);

   foreach (Stream report in reports)
   {    
      message.Attachments.Add(new Attachment(report, "application/pdf"));
   }

   smtpClient.Send(message);
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使 StreamCollection 通用,然后它可以用于任何 IDisposable 对象 (2认同)

the*_*oop 5

您可以创建一个 DisposableList,您可以将其包装在 using 语句中:

public class DisposableList<T> : List<T>, IDisposable where T : IDisposable {

    // any constructors you need...

    public void Dispose() {
        foreach (T obj in this) {
            obj.Dispose();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)