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

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


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


我试图在对象上显式调用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声明。


我怎样才能避免它?


潇潇雨雨
浏览 87回答 3
3回答

潇湘沐

这可能会发生,因为您可能尝试执行FileStream.Close(), 和FileStream.Dispose()在您的情况下使用 Dispose 没有意义,您可以使用 Close 方法。close 方法将使用 'true' 值执行 Dispose 方法。请观看“FileStream.Close()”方法的这个解释:https://msdn.microsoft.com/en-us/library/aa328800(v=vs.71).aspxClose 的此实现调用 Dispose 方法并传递一个真值。

浮云间

在 a 的特定情况下FileStream,您不需要将其处置来关闭文件,您只需要使用 Close 方法。

侃侃无极

尝试摆脱这条线。您在 finally 块中调用 dispose ,该块将始终运行。所以你可以删除这一行。
打开App,查看更多内容
随时随地看视频慕课网APP