在 Class 属性 中使用 MemoryStream 和 IDisposable
Using in Class Property MemoryStream and IDisposable
我正在使用 openxml 创建 excel 和 powerpoint 文档。
因为我不想创建空文件,所以我想确保只在文档完成时使用我自己的 Save
方法编写文档。效果很好。
不过,在开发过程中,当它崩溃时,通常会暂时阻塞DLL文件。我在想 IDisposable 没有被正确调用。有没有办法在我的 class 属性 _MemStream
中定义 using?
public partial class Presentation
{
public Pa.PresentationDocument PresentationDoc { get; set; } //PresentationPart parts
private MemoryStream _MemStream { get; set; }
public void Init(string FileName = "NoName")
{
//Init stream
this._MemStream = new MemoryStream();
this.PresentationDoc = Pa.PresentationDocument.Create(
this._MemStream, PresentationDocumentType.Presentation);
// Create the presentation
}
public string Save(string path)
{
this.PresentationDoc.Close();
using (FileStream fileStream = new FileStream(FileTemp,
System.IO.FileMode.CreateNew))
{
this._MemStream.WriteTo(fileStream);
}
this._MemStream.Flush();
}
}
Dispose
方法未被魔法调用。如果您的 class 创建一次性成员,那么 class 本身应该实现 IDisposable
接口并调用这些成员的 Dispose
方法。如果 class 在方法范围内创建一次性实例,这些实例应调用 Dispose 方法。
因此 Presentation 应该实现 IDisposable
接口,您可以在其中配置 _MemStream
和可能的接口。
使用 Presentation
class 的客户端应该调用 Dispose
方法,框架不会为我们做这个。
正如 Adrian 所说,事物不会被魔法处置。因此,开始处理的一种方法是让 Presentation 实现 IDisposable 本身,然后在那里处理你的资源。
例如:
public partial class Presentation : IDisposable
{
public Pa.PresentationDocument PresentationDoc { get; set; } //PresentationPart parts
private MemoryStream _MemStream { get; set; }
public void Init(string FileName = "NoName")
{
//Init stream
this._MemStream = new MemoryStream();
this.PresentationDoc = Pa.PresentationDocument.Create(
this._MemStream, PresentationDocumentType.Presentation);
// Create the presentation
}
public string Save(string path)
{
this.PresentationDoc.Close();
using (FileStream fileStream = new FileStream(FileTemp,
System.IO.FileMode.CreateNew))
{
this._MemStream.WriteTo(fileStream);
}
this._MemStream.Flush();
}
public void Dispose()
{
if(_MemStream != null)
{
_MemStream.Dispose();
}
}
}
我正在使用 openxml 创建 excel 和 powerpoint 文档。
因为我不想创建空文件,所以我想确保只在文档完成时使用我自己的 Save
方法编写文档。效果很好。
不过,在开发过程中,当它崩溃时,通常会暂时阻塞DLL文件。我在想 IDisposable 没有被正确调用。有没有办法在我的 class 属性 _MemStream
中定义 using?
public partial class Presentation
{
public Pa.PresentationDocument PresentationDoc { get; set; } //PresentationPart parts
private MemoryStream _MemStream { get; set; }
public void Init(string FileName = "NoName")
{
//Init stream
this._MemStream = new MemoryStream();
this.PresentationDoc = Pa.PresentationDocument.Create(
this._MemStream, PresentationDocumentType.Presentation);
// Create the presentation
}
public string Save(string path)
{
this.PresentationDoc.Close();
using (FileStream fileStream = new FileStream(FileTemp,
System.IO.FileMode.CreateNew))
{
this._MemStream.WriteTo(fileStream);
}
this._MemStream.Flush();
}
}
Dispose
方法未被魔法调用。如果您的 class 创建一次性成员,那么 class 本身应该实现 IDisposable
接口并调用这些成员的 Dispose
方法。如果 class 在方法范围内创建一次性实例,这些实例应调用 Dispose 方法。
因此 Presentation 应该实现 IDisposable
接口,您可以在其中配置 _MemStream
和可能的接口。
使用 Presentation
class 的客户端应该调用 Dispose
方法,框架不会为我们做这个。
正如 Adrian 所说,事物不会被魔法处置。因此,开始处理的一种方法是让 Presentation 实现 IDisposable 本身,然后在那里处理你的资源。
例如:
public partial class Presentation : IDisposable
{
public Pa.PresentationDocument PresentationDoc { get; set; } //PresentationPart parts
private MemoryStream _MemStream { get; set; }
public void Init(string FileName = "NoName")
{
//Init stream
this._MemStream = new MemoryStream();
this.PresentationDoc = Pa.PresentationDocument.Create(
this._MemStream, PresentationDocumentType.Presentation);
// Create the presentation
}
public string Save(string path)
{
this.PresentationDoc.Close();
using (FileStream fileStream = new FileStream(FileTemp,
System.IO.FileMode.CreateNew))
{
this._MemStream.WriteTo(fileStream);
}
this._MemStream.Flush();
}
public void Dispose()
{
if(_MemStream != null)
{
_MemStream.Dispose();
}
}
}