Отцепить цель Func - PullRequest
       11

Отцепить цель Func

0 голосов
/ 17 мая 2018

У меня есть словарь байтов [], Func, как показано ниже:

 public class ImageSizeReader : IDisposable
 {

    private Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders;

    public ImageSizeReader()
    {
        imageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>()
        {
            { new byte[] { 0x42, 0x4D }, DecodeBitmap },
            { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif },
            { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif },
            { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng },
            { new byte[] { 0xff, 0xd8 }, DecodeJfif }};
    }

    private Size DecodeBitmap(BinaryReader binaryReader)
    {
    ....
    }

    private Size DecodeGif(BinaryReader binaryReader)
    {
        ...
    }

    private Size DecodePng(BinaryReader binaryReader)
    {
      ...
    }

    private Size DecodeJfif(BinaryReader binaryReader)
    {
       ...
    }

}

После использования Memory Profiler я заметил, что этот словарь предотвращает сборку мусора в родительском классе:

enter image description here

Я предполагаю, что это потому, что делегат Func все еще подключен. Как бы я «отцепил» этот список делегатов правильно?

1 Ответ

0 голосов
/ 17 июля 2018

Я вернулся к этому и в конце концов обнаружил, что код на изображении выше был скомпилирован с помощью оператора linq:

int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;

Я удалил этот метод и сделал то же самое в цикле foreach, который разрешалвыпуск.

...