使用pinvoke的多线程ReadFile调用给出了STATUS_INVALID_USER_BUFFER

时间:2018-02-02 08:44:59

标签: c# multithreading pinvoke readfile

我正在编写一些代码来绕过二进制文件中的块来绕过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),但我不明白为什么。

可能导致此问题的原因,我该如何解决?

1 个答案:

答案 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);

我不确定为什么这会解决这个问题,但似乎确实如此。