C#使用回调返回调用方法中的执行

C#使用回调返回调用方法中的执行,c#,callback,delegates,yield,C#,Callback,Delegates,Yield,我面临着从文件流读取的优化问题,我想构建一个可以读取结构头的函数,然后在完成后读取它遇到的所有引用。这是我可以通过回拨来做的吗 目前,我正在将引用查找项存储到队列中,并将该队列与找到的每个新项连接起来(如果是单个项,则使用queue函数)。我返回此方法的结果,并将其传递给另一个方法,该方法读取所有引用对象的标题并将其分配给该对象。这对性能来说是非常糟糕的,但仍然比我以前的随机读取要好 在树结构的文件流中,所有引用对象都以线性顺序存在 public override Queue<BlamPo

我面临着从文件流读取的优化问题,我想构建一个可以读取结构头的函数,然后在完成后读取它遇到的所有引用。这是我可以通过回拨来做的吗

目前,我正在将引用查找项存储到队列中,并将该队列与找到的每个新项连接起来(如果是单个项,则使用queue函数)。我返回此方法的结果,并将其传递给另一个方法,该方法读取所有引用对象的标题并将其分配给该对象。这对性能来说是非常糟糕的,但仍然比我以前的随机读取要好

在树结构的文件流中,所有引用对象都以线性顺序存在

public override Queue<BlamPointer> ReadFields(BinaryReader binaryReader)
    {
        var blamPointers = new Queue<BlamPointer>(base.ReadFields(binaryReader));
        type = (Type) binaryReader.ReadInt16();
        format = (Format) binaryReader.ReadInt16();
        usage = (Usage) binaryReader.ReadInt16();
        flags = (Flags) binaryReader.ReadInt16();
        detailFadeFactor01 = binaryReader.ReadSingle();
        sharpenAmount01 = binaryReader.ReadSingle();
        bumpHeightRepeats = binaryReader.ReadSingle();
        spriteSize = (SpriteSize) binaryReader.ReadInt16();
[....]
        meleeAimAssist = new MeleeAimAssistStructBlock();
        blamPointers = new Queue<BlamPointer>(blamPointers.Concat(meleeAimAssist.ReadFields(binaryReader)));
        blamPointers.Enqueue(ReadBlockArrayPointer<BitmapGroupSequenceBlock>(binaryReader));
        blamPointers.Enqueue(ReadBlockArrayPointer<BitmapDataBlock>(binaryReader));
        return blamPointers;
    }
公共覆盖队列读取字段(BinaryReader BinaryReader)
{
var-pointers=新队列(base.ReadFields(binaryReader));
type=(type)binaryReader.ReadInt16();
format=(format)binaryReader.ReadInt16();
用法=(用法)binaryReader.ReadInt16();
flags=(flags)binaryReader.ReadInt16();
detailFadeFactor01=binaryReader.ReadSingle();
锐化amount01=binaryReader.ReadSingle();
bumpHeightRepeats=binaryReader.ReadSingle();
spriteSize=(spriteSize)binaryReader.ReadInt16();
[....]
meleeAimAssist=新的MeleeAimAssistStructBlock();
blamPointers=新队列(blamPointers.Concat(meleeAimAssist.ReadFields(binaryReader));
Enqueue(ReadBlockArrayPointer(binaryReader));
Enqueue(ReadBlockArrayPointer(binaryReader));
返回指针;
}
这真的很糟糕,因为它创建了大量的GC足迹

public virtual void Read(BinaryReader binaryReader)
    {
        var pointers = ReadFields(binaryReader);
        ReadPointers(binaryReader, pointers);
    }

public override void ReadPointers(BinaryReader binaryReader, Queue<BlamPointer> blamPointers)
    {
        base.ReadPointers(binaryReader, blamPointers);
        meleeAimAssist.ReadPointers(binaryReader, blamPointers);
        sequences = ReadBlockArrayData<BitmapGroupSequenceBlock>(binaryReader, blamPointers.Dequeue());
        bitmaps = ReadBlockArrayData<BitmapDataBlock>(binaryReader, blamPointers.Dequeue());
    }
公共虚拟无效读取(BinaryReader BinaryReader)
{
变量指针=读取字段(二进制读取器);
读指针(binaryReader,指针);
}
公共重写无效读指针(BinaryReader、队列指针)
{
ReadPointers(二进制读取器、指针);
读取指针(binaryReader,指针);
sequences=ReadBlockArrayData(binaryReader,blamPointers.Dequeue());
位图=ReadBlockArrayData(binaryReader,blamPointers.Dequeue());
}

我想知道是否有一种方法可以从读取“指针”的方法中生成引用“blamPointer”函数,然后使用回调函数或其他方法返回该函数以完成对引用对象的读取?

是否尝试为同一对象创建Action\Func委托?我正在考虑,创建一个操作,然后用参数将方法包装到其中,但这对perf来说不是更糟糕吗?我通常使用CodeDom来生成这个代码,这样就不可能了。