【发布时间】:2010-11-30 05:19:59
【问题描述】:
我正在尝试将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 调用它是一样的吗?如果没有,我应该在声明或函数调用本身中更改什么?
我也很好奇是否应该使用SafeHandle 或HandleRef 而不是IntPtr 作为hFile 参考?我知道要确保在完成后使用CloseHandle(IntPtr) 关闭手柄,只是不确定是否有任何其他理由使用其他两个选项而不是IntPtr。我也在尽量避免使用不安全的代码。
编辑:事实证明,我不应该将第四个参数设置为IntPtr.Zero,因为即使我异步运行,它仍然可以立即返回。见Asynchronous Disk I/O。啊,我喜欢矛盾的故事。
【问题讨论】:
标签: c# file-io asynchronous