首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何关闭在一个循环中创建的多个MemoryStream?

如何关闭在一个循环中创建的多个MemoryStream?
EN

Stack Overflow用户
提问于 2016-08-19 10:48:32
回答 1查看 1.3K关注 0票数 1

我不能在循环中使用using,因为这样我就不能发送电子邮件了,因为cannot access a closed stream

我不能using(MemoryStream memoryStream = new MemoryStream()){the rest of the codes},因为只有第一个excel将有数据,其余的将是空的文件大小为64B。我已经验证了所有excel有数据,然后通过电子邮件发送它。

代码语言:javascript
运行
复制
foreach (workbook excel in workbooks)
{
    MemoryStream memoryStream = new MemoryStream();
    excel.hssfWorkBook.Write(memoryStream);
    memoryStream.Position = 0;
    mailMessage.Attachments.Add(new Attachment(memoryStream, excel.fileName, "application/vnd.ms-excel"));
}
smtpClient.Send(mailMessage);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 10:55:27

不需要关闭这个内存流。

你只需要确保你的mailMessage被正确的放置。一旦它被释放,所有附件也被释放,因此它们的Streams也被释放。

查看MailMessage source code here和search Dispose()的实现:

代码语言:javascript
运行
复制
public void Dispose()
{
    Dispose(true);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing && !disposed)
    {
        disposed = true;

        if(views != null){
            views.Dispose();
        }
        if(attachments != null){
            attachments.Dispose();
        }
        if(bodyView != null){
            bodyView.Dispose();
        }
    }
}

要处理您的mailMessage,只需像这个简单的例子一样使用using

代码语言:javascript
运行
复制
using (var mailMessage = new MailMessage())
{
    using (var smtpClient = new SmtpClient())
    {
        foreach (workbook excel in workbooks)
        {
            MemoryStream memoryStream = new MemoryStream();
            excel.hssfWorkBook.Write(memoryStream);
            memoryStream.Position = 0;
            mailMessage.Attachments.Add(new Attachment(memoryStream, excel.fileName, "application/vnd.ms-excel"));
        }
        smtpClient.Send(mailMessage);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39030377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档