与.Net Mail附件一起使用时,处置MemoryStream

sca*_*cci 5 .net c# idisposable memorystream using-statement

我正在使用MemoryStream从存储在数据库中的二进制文件中添加附件。我的问题是我想正确处理MemoryStream。使用“ using”语句很容易做到这一点,但是当我有多个附件时,我不知道如何正确处理多个MemoryStream。

有没有很好的方法可以遍历并附加文件,但是同时正确处理了我要附加的MemoryStreams?当我尝试在使用smtp之前刷新/关闭时,通过错误发送它,指出流已经关闭。

任何建议,将不胜感激。

Adi*_*dov 6

我知道这是旧帖子,但事实证明,处置MailMessage或仅将其包含在using语句中就足够了,因为何时MailMessage处置所有AttachmentCollection也已处置,何时Attachment处置Stream也已处置。查看ReferenceSource以获取完整代码。

using(MailMessage mail = new MailMessage())
{
   // Add attachments without worring about disposing them
}
Run Code Online (Sandbox Code Playgroud)


gdo*_*ica 3

您可以迭代MemoryStreams 并处理它们。将处理代码放在finallyequals tousing语句块中。

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

try
{
    //....
}
finally
{
    foreach (var x in list)
    {
        x.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

using 语句可确保即使在调用对象方法时发生异常,也会调用 Dispose。您可以通过将对象放入 try 块中,然后在 finally 块中调用 Dispose 来实现相同的结果;事实上,这就是编译器翻译 using 语句的方式。

来自MSDN