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);
}
}
}
我发现的唯一有意义的信息是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:不,它没有帮助。现在我正在考虑抛出超时错误并重新打开设备