Взаимодействие, перекрытие ввода / вывода, ручки: использовать SafeHandle или пин?
Когда вы передаете неуправляемый дескриптор (хранящийся в IntPtr или SafeHandle на управляемой стороне) от управляемого к неуправляемому коду для выполнения перекрывающихся операций ввода-вывода, каков правильный подход?
- используйте SafeHandle, чтобы обернуть (IntPtr) дескриптор ОС,
- или используйте GCHandle.Alloc(IntPtrHandle, GCHandleType.Pinned), чтобы закрепить его?
В настоящее время я использую SafeHandle в сочетании со структурой NativeOverlapped, но я все больше и больше начинаю подозревать, что GC перемещается в памяти по одному или обоим, в то время как выполняется неуправляемый перекрывающийся ввод-вывод.
Не лучше ли мне вернуться к использованию IntPtr вместо SafeHandle и использовать структуру GCHandle для его закрепления?
Или правильная комбинация всего, то есть в вашем NativeOverlapped, использовать закрепленную версию IntPtr, которая, в свою очередь, исходит от SafeHandle?
-- РЕДАКТИРОВАТЬ
Размышляя об этом во время обеда, у меня возникла мысль, что я тупой. Должна быть закреплена перекрывающаяся структура, а не ручка в ней. Это правильный (лучший) ответ?