我正在编写一些代码来绕过二进制文件中的块来绕过FileStream中的缓冲,因为它在使用LockFileEx来锁定文件区域时会导致问题。此代码与参考源中的FileStream中的实现非常相似。
private unsafe int ReadFileNative(SafeFileHandle handle, byte[] bytes, int offset, int count, out int hr)
{
int r = 0;
int numBytesRead = 0;
fixed (byte* p = bytes)
{
r = Native.ReadFile(handle, p + offset, count, out numBytesRead, IntPtr.Zero);
}
导入ReadFile的地方:
unsafe internal static extern int ReadFile(SafeFileHandle handle, byte* bytes,
int numBytesToRead, out int numBytesRead, IntPtr mustBeZero);
我的代码有8个线程,每个线程都试图从文件中读取,每个线程都有一个带有自己的读指针的独立文件句柄,我从80K块的35GB文件中读取。 有时这个读取失败并出现错误0xc00000e8(STATUS_INVALID_USER_BUFFER),但我不明白为什么。
可能导致此问题的原因,我该如何解决?
答案 0 :(得分:0)
我设法使用GCHandle.Alloc解决了这个问题
GCHandle gch = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
r = WdfWin32Native.ReadFile(handle, bytes, count, out numBytesRead, IntPtr.Zero);
}
finally
{
gch.Free();
}
声明了ReadFile:
unsafe internal static extern int ReadFile(SafeFileHandle handle,
byte [] bytes, int numBytesToRead, out int numBytesRead, IntPtr mustBeZero);
我不确定为什么这会解决这个问题,但似乎确实如此。