我正在使用一个非托管函数,它需要一个指向一些非托管内存的指针。该函数在调用时立即返回,并在后台对内存进行异步操作。当操作完成时,它需要一个额外的 IntPtr 传递回我的托管代码。可以同时运行多个此类操作。
我将指向非托管内存的指针封装在自定义 SafeBuffer 实例中,我希望在异步操作完成时取回该实例。SafeBuffer 确保在没有对其的引用时正确释放内存。问题是,当非托管函数仍在使用内存时,当然不应该释放内存。
我怎样才能做到这一点?非托管函数被调用数十亿次,因此性能至关重要。
每当我调用该函数时,我都可以分配一个 GCHandle,在操作完成时使用它来取回 SafeBuffer,然后释放它。但是,分配句柄似乎很昂贵,并且性能会随着时间的推移而显着下降。
我可以分配一次 GCHandle,但是当内存未被非托管函数使用并且没有对 SafeBuffer 的引用时,非托管内存不会被释放。
有任何想法吗?