Не знаю, почему, но наугад при вызове функции InternetQueryDataAvailable
возникает исключение null ref без видимой причины, так как не аргументы, которые он принимает, могут быть нулевыми:
[DllImport(Dlls.Wininet, SetLastError = true)]
public static extern bool InternetQueryDataAvailable([In] IntPtr hFile, [Out] out int numberOfBytesAvailable, [Optional, In] int reserved0, [Optional, In] IntPtr reserved1);
Вот исключение:
И нет, CheckHandle()
не является виновником, поскольку все, что он делает, это проверяет, является ли _handle
нулем или нет, или недействительным.
Кроме того, если не это, то после загрузки всех данных и попытки закрыть приложение, грехи я настроил так, что все ручки закрываются до закрытия приложения, вызов InternetCloseHandle
выбрасывает нулевой refисключение, хотя, как и в случае с InternetQueryDataAvailable
, ни один из аргументов не может быть обнуляемым грехом, все, что он принимает, это единственный IntPtr
:
[DllImport(Dlls.Wininet, SetLastError = true)]
public static extern bool InternetCloseHandle([In] IntPtr hInternet);
Не уверен, что происходит, потому что в редких случаях все работаетХорошо, и я могу загрузить все данные и закрыть дескриптор без случайного исключения.
Для тех, кому интересно, как выглядит функция с InternetCloseHandle, это просто:
public void Dispose()
{
if (_handle != IntPtr.Zero)
{
if (!WinINet.InternetCloseHandle(_handle))
{
throw new Win32Exception();
}
_handle = IntPtr.Zero;
}
}
Записьчто исключение, которое выдается после вызова InternetQueryDataAvailable
, возникает только после первого вызова, поэтому первый из них в порядке, но все последующие могут вызвать исключение.