如何摆脱“对象'对象'在方法中可以多次处置”

时间:2019-01-15 13:15:58

标签: c# idisposable

我正在使用Visual Studio工具分析代码,并收到以下消息:

  

对象'FileStream'可以在方法'BitmapFormat.WriteBitmap(byte [],int,int)'中多次处置。为避免生成System.ObjectDisposedException,不应在一个对象上多次调用Dispose。

我试图显式调用对象上的处置方法,但无济于事。

这是方法:

Stream FileStream = null;
try
{
    FileStream = File.Open("finger.bmp", FileMode.Create, FileAccess.Write);
    BinaryWriter TmpBinaryWriter = new BinaryWriter(FileStream);
    TmpBinaryWriter.Write(StructToBytes(BmpHeader, 14));
    TmpBinaryWriter.Write(StructToBytes(BmpInfoHeader, Marshal.SizeOf(BmpInfoHeader)));

    //µ÷ÊÔ°åÐÅÏ¢
    for (ColorIndex = 0; ColorIndex < m_nColorTableEntries; ColorIndex++)
    {
        ColorMask[ColorIndex].redmask = (byte)ColorIndex;
        ColorMask[ColorIndex].greenmask = (byte)ColorIndex;
        ColorMask[ColorIndex].bluemask = (byte)ColorIndex;
        ColorMask[ColorIndex].rgbReserved = 0;

        TmpBinaryWriter.Write(StructToBytes(ColorMask[ColorIndex], Marshal.SizeOf(ColorMask[ColorIndex])));
    }

    //ͼƬÐýת£¬½â¾öÖ¸ÎÆͼƬµ¹Á¢µÄÎÊÌâ
    RotatePic(buffer, nWidth, nHeight, ref ResBuf);

    //дͼƬ
    //TmpBinaryWriter.Write(ResBuf);
    byte[] filter = null;
    if (w - nWidth > 0)
    {
        filter = new byte[w - nWidth];
    }
    for (int i = 0; i < nHeight; i++)
    {
        TmpBinaryWriter.Write(ResBuf, i * nWidth, nWidth);
        if (w - nWidth > 0)
        {
            TmpBinaryWriter.Write(ResBuf, 0, w - nWidth);
        }
    }

    TmpBinaryWriter.Close();
    FileStream.Close(); // <----- THE WARNING IS HERE
}
finally
{
    if (FileStream != null)
        FileStream.Dispose();
}

如果我删除try finally块,也会发生同样的情况。即使我使用using语句。

如何避免呢?

3 个答案:

答案 0 :(得分:0)

尝试摆脱这条线。您将调用处在finally块中,该块将始终运行。因此,您可以删除此行。

答案 1 :(得分:0)

FileStream的特定情况下,您不需要将其丢弃即可关闭文件,只需使用Close方法。

答案 2 :(得分:0)

可能会发生这种情况,因为您可能尝试执行

FileStream.Close(), 和

FileStream.Dispose()

在这种情况下,使用Dispose毫无意义,您只能使用Close方法。 close方法将以'true'值执行Dispose方法。

请观看'FileStream.Close()'方法的详细介绍:

https://msdn.microsoft.com/en-us/library/aa328800(v=vs.71).aspx

  

此Close的实现调用传递真实值的Dispose方法。