【发布时间】:2020-06-02 15:16:29
【问题描述】:
我有一个需要调用的非托管函数,它接受一个等待句柄作为参数。非托管代码在适当时向这个等待句柄发出信号,以通知我的代码某些情况。我的问题是,我是否需要以某种方式固定此等待句柄以防止 GC 移动等待句柄?
(伪)代码如下所示:
using (var resetEvent = new AutoResetEvent(false))
{
var iBuffer = Convert.ToUInt32(resetEvent.SafeWaitHandle.DangerousGetHandle().ToInt32());
// Pass iBuffer to unmanaged API function. The unmanaged API passes in the wait handle as a ref uint.
var handles = new[] {resetEvent, _cancellationTokenSource.Token.WaitHandle};
while(WaitHandle.WaitAny(handles) == 0)
{
// do stuff in response to resetEvent being signaled.
}
}
我没有直接传递 AutoResetEvent 对象(甚至是其中的“SafeWaitHandle”),但实际上返回的是 DangerousGetHandle()。我不清楚返回的“危险”句柄是否真的代表非托管资源,因此不需要任何固定?
【问题讨论】: