我正在尝试设置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
);
我这样调用它(希望第四个参数为空):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
那么这是否与使用null调用它相同呢?如果不是,我应该在声明中或函数调用本身中更改什么?
我还想知道,对于hFile
引用,是否应该使用SafeHandle
或HandleRef
而不是IntPtr
?我知道要确保在完成后使用CloseHandle(IntPtr)
关闭句柄,但不确定是否有任何其他原因可以使用另外两个选项而不是IntPtr
。我还试图避免使用不安全的代码。
编辑:事实证明,无论如何都不应将第四个参数设置为IntPtr.Zero
,因为即使我异步运行,它也可能立即返回。请参见异步磁盘I/O。啊,我喜欢自相矛盾的故事。