如何编写在函数执行过程中垃圾回收的测试用例?

How to write a test case which garbage collects in the middle of a function execution?

本文关键字:测试用例 何编写 函数 执行 过程中      更新时间:2023-10-16

我有一个原生类:

class NativeClass
{
int someVariable;
public:
void someNativeFunction(){}
};

我有一个托管类,它轻轻地包装了这个本机类。

class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
nativeClassObject->someNativeFunction();
}
};

我在 C# 应用程序中使用此托管类:

static void Main(string[] args)
{
ManagedClass objManagedClass = new ManagedClass();
objManagedClass.someManagedFunction();//line_1
//At this point onwards objManagedClass still has a reference on the stack, but is not used again.
//So, GC can delete this object.
}

由于objManagedClass在line_1后不被引用,因此垃圾回收器可以自由销毁对象,即使它正在处理内部本机调用也是如此。这将导致objManagedClass的破坏,进而破坏*nativeClassObject。仅当someNativeFunction分配大量内存或花费很长时间时,才可能发生这种情况,但可以肯定的是,我必须在调用后稍后添加对objManagedClass的引用。

class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
nativeClassObject->someNativeFunction();
...
...
System::GC::KeepAlive(this);
}
};

KeepAlive()调用应防止 GC 销毁它。有什么方法可以测试这种情况吗?我可以编写的一些测试用例,如果我不提供KeepAlive()就会失败,但是一旦我调用它就会通过吗?Thread.Sleep(5000)托管函数之间的调用是否有帮助?

您可以通过调用GC::Collect强制垃圾回收开始,然后使用GC::WaitForPendingFinalizers等待垃圾回收完成。这应该允许你测试你的方案。

查看 MSDN 上的示例