我正在建立一个订阅服务,按时间表向我们公司的各个人发送报告.我打算通过电子邮件发送报告,我正在使用的报告系统能够导出为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)
您可以创建一个 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)
| 归档时间: |
|
| 查看次数: |
5908 次 |
| 最近记录: |