メールに添付ファイルを追加するコードがいくつかあります。クラスコンストラクターの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);
}
はバイトdoc.doc
配列です。各添付ファイルとストリームを適切に破棄したいのですが、メッセージが送信されるまで実行できないため、それらを a に追加してから、繰り返し処理して dispose を呼び出すことを考えていまし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();
}
}
しかし、ガベージコレクションなどを取得していない参照がまだ浮かんでいる場合、それらを適切に破棄しないことがわかります。何かご意見は?