簡體   English   中英

MemoryStream的麻煩

[英]MemoryStream troubles

我在使用MemoryStream時遇到了一些麻煩

我們使用的是第三方電子表格組件(類似於excel),並且我試圖通過下面的SaveHtml方法將數據保存為html,它們支持。 根據他們的文檔看來很簡單。 這是我的代碼:

using (var memoryStream = new MemoryStream())
{
   this.ActiveSheet.SaveHtml(memoryStream);

   memoryStream.Position = 0;

   using (var streamReader = new StreamReader(memoryStream))
   {
       var htmlData = streamReader.ReadToEnd();
   }
}

設置memoryStream.Position = 0時出現異常:

System.ObjectDisposedException: Cannot access a closed Stream.

快速查看他們在Reflector中的SaveHtml方法將顯示以下相關行:

public void SaveHtml(Stream stream)
{
    StreamWriter writer = null;

    try
    {
        writer = new StreamWriter(stream) { AutoFlush = true };

        writer.Write(str);
    }   
    finally
    {
        if (writer != null)
        {
            writer.Close();
        }
    }
}

我猜是因為streamWriter被他們的代碼關閉了,所以我們很不走運。 關閉streamWriter,關閉基礎Stream,對嗎?

有什么辦法解決這個問題?

謝謝。

似乎可以,所以您可以創建另一個內存流。 提取緩沖區時,不復制任何字節。

using (var memoryStream = new MemoryStream()) {
    this.ActiveSheet.SaveHtml(memoryStream);
    var buffer = memoryStream.GetBuffer();
    using (var memoryStream2 = new MemoryStream(buffer))
    using (var streamReader = new StreamReader(memoryStream2)) {
        var htmlData = streamReader.ReadToEnd();
    }
}

或者,您可以推出自己無法關閉的MemoryStream,並將其提供給SaveHtml。 這也將阻止處理它,因為Dispose僅調用Close。 再次,恕我直言:

class MemoryStream2 : MemoryStream {
    public override void Close() { }
}

可以在以下情況下使用備用內存流實現:

var stream = new ChunkedStream(pool, asOutputStreamOnDispose: true);

using (var writer = new StreamWriter(stream))
{
    writer.Write("hello world");
}

Assert.AreEqual(0, stream.Position);
Assert.AreEqual(ChunkedStreamState.ReadForward, stream.State);
Assert.AreEqual(3, pool.TotalAllocated);

using (var reader = new StreamReader(stream))
{
    Assert.AreEqual("hello world", reader.ReadToEnd());
    Assert.AreEqual(0, pool.TotalAllocated);
}

Assert.AreEqual(ChunkedStreamState.Closed, stream.State);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM