Я пытаюсь настроить ReadFile
для асинхронной работы и в соответствии с MSDN мне нужно установить lpNumberOfBytesRead
на null
:
"Используйте NULL для этого параметра, если это асинхронная операция, чтобы избежать потенциально ошибочных результатов."
Например, если у меня есть следующее:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool ReadFile(
IntPtr hFile,
out byte[] aBuffer,
int cbToRead,
IntPtr cbThatWereRead,
ref OVERLAPPED pOverlapped
);
и я называю это так (с намерением, чтобы 4-й параметр был нулевым):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
это будет то же самое, что назвать его с нулем? Если нет, что я должен изменить в объявлении или в самом вызове функции?
Мне также было любопытно, следует ли мне использовать SafeHandle
или HandleRef
вместо IntPtr
для ссылки hFile
? Я знаю, чтобы убедиться, что я закрываю ручку с CloseHandle(IntPtr)
, когда я закончу с этим, просто не уверен, есть ли какая-либо причина использовать две другие опции над IntPtr
. Я также стараюсь избегать использования небезопасного кода.
РЕДАКТИРОВАТЬ: Как выясняется, я не должен был устанавливать четвертый параметр в IntPtr.Zero
в любом случае, потому что, хотя я работаю асинхронно, он все равно может вернуться сразу же. См. Асинхронный дисковый ввод-вывод . Ах, я люблю противоречивые истории.