我试图设置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
);
Run Code Online (Sandbox Code Playgroud)
我这样称呼它(意图使第4个参数为null):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
Run Code Online (Sandbox Code Playgroud)
是否与使用null调用它相同?如果没有,我应该在声明或函数调用本身中更改什么?
我也好奇,如果我应该使用SafeHandle或HandleRef代替IntPtr的hFile参考?我知道CloseHandle(IntPtr)当我完成它时确保关闭手柄,只是不确定是否有任何其他理由使用其他两个选项IntPtr.我也在努力避免使用不安全的代码.
编辑:事实证明,我不应该设置第四个参数IntPtr.Zero,因为即使我异步运行,它仍然可以立即返回.见异步磁盘I/O.啊,我喜欢自相矛盾的故事.