WebClient DownloadString导致有时"对象引用未设置为对象的实例"例外

时间:2016-04-13 11:47:04

标签: c# multithreading webclient nullreferenceexception

在我的C#程序中,我使用WebClient来下载一般工作正常的字符串,但我不时会得到异常"对象引用未设置为对象的实例"。

以下示例显示了代码的相关部分:

String ResponseString = "";
String URITarget = "..... my URI information .....";

using (WebClient WebClientInstance = new WebClient())
{

    WebClientInstance.Encoding = System.Text.Encoding.UTF8;
    WebClientInstance.Headers.Add("Content-Type", "application/json");

    ResponseString = WebClientInstance.DownloadString(URITarget);

}

此代码行发生异常:

ResponseString = WebClientInstance.DownloadString(URITarget);

由于我正在使用线程,因此具有上述代码的函数可以在理论上同时从不同的线程调用,我首先认为问题可能是由线程引起的,因为WebClient不是线程安全的。但是在围绕上面的代码实现锁定(SendWebClientHTTPRequestThreadLock)之后,它没有带来任何改进:

private Object SendWebClientHTTPRequestThreadLock = new Object();

...


String ResponseString = "";
String URITarget = "..... my URI information .....";

lock (SendWebClientHTTPRequestThreadLock)
{

    using (WebClient WebClientInstance = new WebClient())
    {

        WebClientInstance.Encoding = System.Text.Encoding.UTF8;
        WebClientInstance.Headers.Add("Content-Type", "application/json");

        ResponseString = WebClientInstance.DownloadString(URITarget);

    }

}

WebClientInstance.DownloadString(URITarget)是否可以出于某种原因返回NULL而不是实际或至少是空字符串?有什么建议吗?

2 个答案:

答案 0 :(得分:0)

在使用块终止之前,WebClientInstance对象无效的事实是奇怪的。我猜它可能与您的应用程序中的资源问题或内存泄漏有关。也许你正在达到线程池的限制,因此你的线程会突然终止。

我还会尝试WebClient的非阻塞方法,例如WebClient.DownloadStringTaskAsync,看看是否有所作为。如果这没有解决问题,我会尝试使用TPL而不是原始线程来进行安全的线程池管理。

答案 1 :(得分:0)

可能是关于安全问题。某些主机需要进行身份验证才能允许读取流。检查远程服务器是否有错误(403)禁止访问。 在这种情况下,您需要传递用户名和密码才能访问该文件。