Утилизируйте MemoryStream при использовании с .Net Mail Attachment - PullRequest
5 голосов
/ 24 января 2012

Я использую MemoryStream для добавления вложений из двоичного файла, который хранится в БД. Моя проблема в том, что я хочу правильно утилизировать MemoryStream. Это легко сделать с помощью оператора «using», но когда у меня есть несколько вложений, я не знаю, как правильно избавиться от нескольких MemoryStreams.

Есть ли хороший способ перебирать и прикреплять файлы, но в то же время правильно избавляться от MemoryStreams, которые я использую для прикрепления? Когда я пытался очистить / закрыть перед использованием smtp. Отправьте сообщение об ошибке, сообщающее, что поток уже закрыт.

Любые предложения будут оценены.

Ответы [ 3 ]

3 голосов
/ 24 января 2012

Вы можете перебрать MemoryStream s и утилизировать их.Помещение кода удаления в блок finally равно выражению using.

var list = new List<MemoryStream>(){new MemoryStream(), new MemoryStream()};

try
{
    //....
}
finally
{
    foreach (var x in list)
    {
        x.Dispose();
    }
}

Оператор using обеспечивает вызов метода Dispose даже в том случае, если при вызове методов объекта вызывается исключительная ситуация,Вы можете достичь того же результата, поместив объект в блок try, а затем вызвав Dispose в блоке finally;на самом деле, именно так оператор using переводится компилятором.

из MSDN

2 голосов
/ 28 мая 2017

Я знаю, что это старый пост, но оказывается, что избавиться от MailMessage или просто заключить его в оператор using достаточно, когда MailMessage удаляется, все AttachmentCollection также удаляется и когда Attachmentутилизируется, Stream также утилизируется.Проверьте ReferenceSource для полного кода.

using(MailMessage mail = new MailMessage())
{
   // Add attachments without worring about disposing them
}
0 голосов
/ 24 января 2012
using (var ms1 = new MemoryStream())
  using (var ms2 = new MemoryStream())
  {
    ...
  }
...