2016-06-23 7 views
0

openxml을 사용하여 Excel 및 PowerPoint 문서를 만듭니다. emtpy 파일을 생성하고 싶지 않기 때문에, 자신의 Save 메소드를 사용하여 완료되었을 때만 문서를 작성하고 싶습니다. 그것은 weel를 작동합니다.클래스 속성 MemoryStream 및 IDisposable 사용

개발 중에 충돌이 발생하면 대개 DLL 파일을 잠시 차단합니다. IDisposable이 제대로 호출되지 않았다고 생각했습니다. 내 클래스 속성에서 사용을 정의하는 방법이 있습니까 _MemStream?

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(); 
    } 
} 
+1

'IDisposable'는 [프로세스를 종료 할 경우 도움이 될하지 않습니다 (http://stackoverflow.com/a/34464312/993547). –

+0

이것은 내가 찾고있는 것이다 : 클래스 속성 대신 "using"을 사용하는 방법이 있는가? 개인 MemoryStream처럼 _MemStream {get; using (set); } – Yoyo

답변

0

애드리안이 말했듯이 모든 것들은 마법으로 처리되지 않습니다. 따라서 처분을 시작하는 한 가지 방법은 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(); 
    } 
    } 
} 
+0

PresentationDoc.Close는 dispose 메서드가 될 가능성이 있으므로 Dispose 메서드에서 이동해야한다고 생각합니다. –

+0

문서가 닫히지 않으면 문서를 스트림에 쓸 수 없습니다. 이것이 저장에있는 이유입니다. 기본적으로 저장 메소드가 끝납니다. 일단 저장되면 this.Dispose가 유용할까요? – Yoyo

+0

인스턴스 내부에서 dispose를 호출하면 안됩니다. 발신자가 자기 자신을 사용하여이를 깨닫지 못하면 예외가 발생합니다. 호출자의 using 절을 사용하여 처리하십시오. 내부적으로 클래스의 저장 유효성을 추적 할 수 있으며 후속 저장을 시도하면 예외가 발생합니다 –

0

마법에 의해 호출되지에서 Dispose 방법. 클래스가 일회용 멤버를 만드는 경우 클래스 자체는 IDisposable 인터페이스를 구현하고 해당 멤버에 대해 Dispose 메서드를 호출해야합니다. 클래스가 메서드 범위에 일회용 인스턴스를 만드는 경우 해당 인스턴스는 Dispose 메서드를 호출해야합니다.

프리젠 테이션은 _MemStream을 처리하고 가능하면 IDisposable 인터페이스를 구현해야합니다.

Presentation 클래스를 사용하는 클라이언트는 Dispose 메서드를 호출해야합니다. 프레임 워크는이 작업을 수행하지 않습니다.

+0

C#에 비교적 익숙하다. 나의 질문은 더 많았다. 나는 그것을해야한다고 확신한다. 그러나 가장 좋은 방법은 무엇인가? 고맙습니다. – Yoyo

+0

https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/ finalizer도 추가 할 필요가 없습니다. –