ReadFile has return ERROR_WORKING_SET_QUOTA

本文关键字:WORKING QUOTA SET ERROR has return ReadFile | 更新日期: 2023-09-27 18:03:48

GetLastError在ReadFile后返回1453 ERROR_WORKING_SET_QUOTA。这是否意味着存在内存泄漏或其他问题?此代码用于与usb设备通信。这个过程工作了10个小时(每40毫秒读取一次)的测试,然后出现错误。

uint ReadBytesCount = 0;
byte[] bytes = new byte[0x8000];
fixed (byte* p = bytes)
{
    if (UnsafeMethods.ReadFile(handle, p, 0x8000, out ReadBytesCount, intOverlapped) == 0)
    {
        int hr = UnsafeMethods.GetLastError(handle);
        if (hr == UnsafeMethods.ERROR_ACCESS_DENIED)
        {
            doCleanup = true;
            break;
        }
        if (hr == NativeMethods.ERROR_IO_PENDING)
        {
            int error = 0;
            // if we get IO pending, MSDN says we should wait 
            // on the WaitHandle, then call GetOverlappedResult
            // use timeout to ensure that first time read
            bool success = waitReadEventWaitHandle.WaitOne(1000);
            if (success)
            {
                uint ReadInProgressCount = 0;
                success = UnsafeMethods.GetOverlappedResult(
                           handle,
                           intOverlapped,
                           ref ReadInProgressCount,
                           false);
                if (!success)
                    error = UnsafeMethods.GetLastError(handle);
                ReadBytesCount += ReadInProgressCount;
                if (!success && error != 0)
                {
                    // Ignore ERROR_IO_INCOMPLETE, because there's a chance 
                    // one of those while shutting down
                    if (!(
                        (error == UnsafeMethods.ERROR_IO_INCOMPLETE)
                        && ShutdownLoop)
                        )
                        Debug.Assert(false, 
                       "GetOverlappedResult,might leak intOverlapped memory"
                       + error.ToString());
                }
            }
        }
        else if (hr != UnsafeMethods.ERROR_INVALID_PARAMETER)
        {
            // ignore ERROR_INVALID_PARAMETER errors. 
            Debug.Assert(false, "ReadUsbLoop returned error " + hr);
        }
    }
}

ReadFile has return ERROR_WORKING_SET_QUOTA

我发现的唯一有意义的信息是mysql错误列表无条件退出(1)ERROR_WORKING_SET_QUOTA 1453 (0x5AD)为InnoDB后端。

当错误发生时,SQL Server worker放弃100ms并尝试读取再次操作。这个循环一直持续到I/O被成功发出为止。下面是一个简化的示例。

WHILE(      FALSE == ReadFile() 
    && (1450 == GetLastError() ||  1453 == GetLastError()) 
)
{
    Yield(100);
}

这使我得出结论,我应该尝试睡眠线程100毫秒,然后重试读取。

uint ReadBytesCount = 0; 
byte[] bytes = new byte[0x8000]; 
fixed (byte* p = bytes) 
{ 
    if (UnsafeMethods.ReadFile(handle, p, 0x8000, out ReadBytesCount, intOverlapped) == 0) 
    { 
        int hr = UnsafeMethods.GetLastError(handle); 
        if (hr == UnsafeMethods.ERROR_ACCESS_DENIED) 
        { 
            doCleanup = true; 
            break; 
        } 
        if (hr == NativeMethods.ERROR_IO_PENDING) 
        { 
            // do something
        }
        else if (hr == UnsafeMethods.ERROR_WORKING_SET_QUOTA ||
                 hr == UnsafeMethods.ERROR_NO_SYSTEM_RESOURCES) 
        {
            Thread.Sleep(100);
        }
        else if (hr != UnsafeMethods.ERROR_INVALID_PARAMETER) 
        { 
            // ignore ERROR_INVALID_PARAMETER errors. 
            Debug.Assert(false, "ReadUsbLoop returned error " + hr); 
        }
    } 
}

Update:不,它没有帮助。现在我正在考虑抛出超时错误并重新打开设备