2016-06-23 4 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

これは私が探しているものです:方法の代わりに、クラスのプロパティの "使用"を使用する方法はありますか?プライベートMemoryStreamのように_MemStream {get; using(set); } – Yoyo

答えて

0

アドリアンによれば、物事は魔法によって処分されません。したがって、処分を開始する1つの方法は、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/ ファイナライザを追加する必要はありません。 –

関連する問題