【问题标题】:Dispose MemoryStream when using with .Net Mail Attachment与 .Net 邮件附件一起使用时释放 MemoryStream
【发布时间】:2012-02-17 11:13:23
【问题描述】:

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

是否有一种好方法可以迭代并附加文件,但同时正确处理我用来附加的 MemoryStreams?当我在使用 smtp 之前尝试刷新/关闭时。通过一条错误消息发送它,指出流已关闭。

任何建议将不胜感激。

【问题讨论】:

  • MailMessage.Dispose() 方法已经释放了它的附件,你不需要帮忙。
  • @HansPassant 这应该是答案。比保留一个流列表然后将其全部处理掉要好得多。
  • @HansPassant 我刚刚注意到它仅适用于 System.Net.Mail.MailMessage 而不是已弃用的 System.Web.Mail.MailMessage 不实现 Idisposeable
  • 好吧,您找到了它被弃用的一个原因。 CDO 已经过时了。

标签: c# .net idisposable memorystream using-statement


【解决方案1】:

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

using(MailMessage mail = new MailMessage())
{
   // Add attachments without worring about disposing them
}

【讨论】:

    【解决方案2】:
    using (var ms1 = new MemoryStream())
      using (var ms2 = new MemoryStream())
      {
        ...
      }
    

    【讨论】:

    • 谢谢@leppie...问题是我可以有1到多个附件...我认为内存流列表可能有效
    • 你可以使用Container
    • container 是什么意思?
    • @gdoron:实际上,这行不通。我错误地认为Container 类允许添加任何IDisposable,但在查看后只需要IComponent。 :(
    【解决方案3】:

    您可以迭代 MemoryStreams 并处置它们。将处理代码放在finally 块中等于using 语句。

    var list = new List<MemoryStream>(){new MemoryStream(), new MemoryStream()};
    
    try
    {
        //....
    }
    finally
    {
        foreach (var x in list)
        {
            x.Dispose();
        }
    }
    

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

    来自MSDN

    【讨论】:

    • 谢谢@gdoron 我会看看...欣赏这个例子
    • 为什么要创建列表? Attachment 类可以通过 Attachment 类属性 ContentStream 访问 Stream。然后,您可以先处理流,然后在 finally 块中处理您的附件。请参阅 MSDN [链接](msdn.microsoft.com/en-us/library/…) 我选择这样做是因为不是所有的 MailMessages 都有附件,而且我不知道有多少附件,所以我不能使用 using 语句。我想我可以重组所有代码以适应使用,但这似乎更简单。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2018-08-15
    • 2013-11-07
    • 2019-04-30
    • 2021-12-24
    相关资源
    最近更新 更多