Взаимодействие, перекрытие ввода / вывода, ручки: использовать SafeHandle или пин?

Когда вы передаете неуправляемый дескриптор (хранящийся в IntPtr или SafeHandle на управляемой стороне) от управляемого к неуправляемому коду для выполнения перекрывающихся операций ввода-вывода, каков правильный подход?

  • используйте SafeHandle, чтобы обернуть (IntPtr) дескриптор ОС,
  • или используйте GCHandle.Alloc(IntPtrHandle, GCHandleType.Pinned), чтобы закрепить его?

В настоящее время я использую SafeHandle в сочетании со структурой NativeOverlapped, но я все больше и больше начинаю подозревать, что GC перемещается в памяти по одному или обоим, в то время как выполняется неуправляемый перекрывающийся ввод-вывод.

Не лучше ли мне вернуться к использованию IntPtr вместо SafeHandle и использовать структуру GCHandle для его закрепления?

Или правильная комбинация всего, то есть в вашем NativeOverlapped, использовать закрепленную версию IntPtr, которая, в свою очередь, исходит от SafeHandle?

-- РЕДАКТИРОВАТЬ

Размышляя об этом во время обеда, у меня возникла мысль, что я тупой. Должна быть закреплена перекрывающаяся структура, а не ручка в ней. Это правильный (лучший) ответ?

0 ответов

Другие вопросы по тегам