2012-03-08 9 views
1

"使用する"ブロックが私のあらかじめ作成されたオブジェクトを改ざんすると、私は本当に迷惑になります。あらかじめ作成されたストリームと "使用"ブロック

System.ArgumentExceptionの:私は、コードのこの部分を持っている

class Asset { 
    public Stream FileStream { get; set; } 

    public Asset(string fileName) { 
     FileStream = ...open a file stream...; 
    } 
} 

// Somewhere else 
Asset asset = new Asset("file.txt"); 
using (var reader = new StreamReader(asset.FileStream)) { 
    //blah blah blah 
} 

// Somewhere else else 
using (var reader2 = new StreamReader(asset.FileStream)) 

=>は、この例外をスロー流れが読めませんでした。

Visual Studioのステップバイステップで、asset.FileStreamが最初の "using"ブロックの後に配置されていることがわかりました。

彼の命を救うために私を助けてください:(( がどのように私は、ストリームからクローンストリームを作成することができます

+2

私は簡単だと思いますあなたがそれを通過する前にストリームを処理しないでください...あなたが使用するブロックを使用すると、それはDiですReaderをスプーンし、ストリームを廃棄します。 –

答えて

2

私は読者が基になるストリームを閉じているという事実が馬鹿であることに同意this articleに概説されたアプローチがあります?。 Streamをラップし、CloseDispose方法には、オペアンプを持っていないデコレータのクラスを作成することができます。あなただけのこれらの読者のためusingを使用しないで検討すべきであるので、それは、しかし、おそらくオーバーヘッド価値はありません。

+0

または、2つの使用ブロックが同じ方法である場合は、最初のブロック内で2番目のブロックを移動することができます。 – phoog

関連する問題