Unhook Func 目标
Unhook Func Target
我有一个byte[]的字典,函数如下:
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 之后,我注意到这个字典正在阻止对其父项进行垃圾回收 class:
我假设这是因为 Func 委托仍处于连接状态。我如何 'unhook' 正确列出此委托?
我回到这里,最终发现上图中的代码是编译器从 linq 语句生成的:
int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;
我删除了这个方法并在解决问题的 foreach 循环中做了同样的事情。
我有一个byte[]的字典,函数如下:
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 之后,我注意到这个字典正在阻止对其父项进行垃圾回收 class:
我假设这是因为 Func 委托仍处于连接状态。我如何 'unhook' 正确列出此委托?
我回到这里,最终发现上图中的代码是编译器从 linq 语句生成的:
int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;
我删除了这个方法并在解决问题的 foreach 循环中做了同样的事情。