Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解除锁定Func目标_C#_Delegates_Func - Fatal编程技术网

C# 解除锁定Func目标

C# 解除锁定Func目标,c#,delegates,func,C#,Delegates,Func,我有一个字节为[],Func的字典,如下所示: public class ImageSizeReader : IDisposable { private Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders; public ImageSizeReader() { imageFormatDecoders = new Dictionary<byte

我有一个字节为[],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)
    {
       ...
    }

}
公共类ImageSizeReader:IDisposable
{
专用字典图像格式解码器;
公共ImageSizeReader()
{
imageFormatDecoders=新字典()
{
{新字节[]{0x42,0x4D},解码位图},
{新字节[]{0x47,0x49,0x46,0x38,0x37,0x61},decodegf},
{新字节[]{0x47,0x49,0x46,0x38,0x39,0x61},decodegf},
{新字节[]{0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A},DecodePng},
{新字节[]{0xff,0xd8},DecodeJfif};
}
私有大小解码位图(BinaryReader BinaryReader)
{
....
}
专用大小解码GIF(二进制读取器二进制读取器)
{
...
}
专用大小解码PNG(BinaryReader BinaryReader)
{
...
}
专用大小解码JFIF(二进制读取器二进制读取器)
{
...
}
}
使用Memory Profiler后,我注意到该字典正在阻止其父类上的垃圾收集:


我假设这是因为Func委托仍处于连接状态。如何才能正确地“解开”此委托列表?

我回到这里,最终发现上图中的代码是由linq语句生成的:

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

我删除了此方法,并在foreach循环中执行了相同的操作,从而解决了此问题。

is
imageFormatDecoders
static?Hi@DanielA.White,我已更新了代码示例。imageFormatDecoders是实例成员。顺便说一句,字节[]产生了一个糟糕的字典键,除非您重写比较器,因为相等是基于引用相等。确保它使实例保持活动,但实例也是唯一使字典保持活动的东西。它们形成一个循环,GC知道如何处理这些循环。一旦对解码器的所有外部引用被释放,它将是可收集的,因为它不能从GC根访问,而不是因为没有对它的引用。