Как избавиться от «Объекта», объект можно утилизировать более одного раза в методе » - PullRequest
0 голосов
/ 15 января 2019

Я анализирую код с помощью инструмента Visual Studio и получаю следующее сообщение:

Объект 'FileStream' может быть размещен более одного раза в методе 'BitmapFormat.WriteBitmap (byte [], int, int)'. Во избежание генерации исключения System.ObjectDisposedException не следует вызывать метод Dispose для объекта более одного раза.

Я пытался вызвать call явно на объекте, но безрезультатно.

Это метод:

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 голосов
/ 15 января 2019

В конкретном случае FileStream вам не нужно утилизировать его, чтобы закрыть файл, вам нужно только использовать метод Close.

0 голосов
/ 15 января 2019

Это может произойти, потому что вы потенциально пытаетесь выполнить

FileStream.Close(), и

FileStream.Dispose()

Нет смысла использовать Dispose в вашем случае, вы можете просто использовать метод Close. Метод close выполнит метод Dispose со значением true.

Пожалуйста, посмотрите это расширение метода FileStream.Close ():

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

Эта реализация Close вызывает метод Dispose, передающий истинное значение.

0 голосов
/ 15 января 2019

Попробуйте избавиться от этой линии. Вы вызываете dispose в блоке finally, который будет работать ВСЕГДА. Таким образом, вы можете удалить эту строку.

...