GetLastErrorは、ReadFileの後に1453ERROR_WORKING_SET_QUOTAを返します。メモリリークや何かがあることを意味しますか?このコードは、USBデバイスと通信するために使用されます。この手順は、テストの10時間(40ミリ秒ごとに読んで)動作し、その後エラーが発生します。ReadFileの戻り値がERROR_WORKING_SET_QUOTA
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);
}
}
}
'File.ReadAllText'メソッドを使用していない理由は何ですか?なぜ安全でないコードですか? –
UnsafeMethodsは、カスタムUSBドライバFTD2XX.DLLにapiをラップします。パフォーマンス要件のために重複した読み込み/書き込みを使用しています – baraban
デバッグ用に 'File.ReadAllText'を使用するようにコードを変更すると、どのようなエラーが発生しますか? –