当调用wininet函数时,随机发生NullReferenceException

问题描述 投票:1回答:1

[不知道为什么,但在调用函数InternetQueryDataAvailable时会随机产生null ref异常,但没有明显的原因,sins所接受的参数都不能为null:

[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);

这里是例外:

enter image description here

[不,CheckHandle()不是罪魁祸首,因为它所做的只是检查_handle是否为零,又是无效的。

[此外,如果不是这样,那么在下载所有数据并尝试关闭应用程序之后,我将它设置为在所有应用程序关闭之前关闭所有句柄,对InternetCloseHandle的调用甚至会抛出null 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之后引发的异常仅在第一次调用之后发生,因此第一次调用是可以的,但所有之后的调用都有机会触发该异常。

c# windows winapi pinvoke wininet
1个回答
0
投票

请注意,在调用InternetQueryDataAvailable之后引发的异常仅在第一次调用之后发生,因此第一次调用就可以,但是所有之后的调用都有机会触发该异常。

这是预料之中的。这是一次数据检索。这些可以always遇到外部异常。如果该功能绕过文件访问或网络操作遍及全球的一半,那就不重要了-这两种情况在黑桃中都有外来的异常可能性。

当然,特定的例外仍然很奇怪。

© www.soinside.com 2019 - 2024. All rights reserved.