Исключение WebClient.OpenRead: «Значение не может быть нулевым». - PullRequest
0 голосов
/ 23 сентября 2010

Я разрабатываю скребок, который очищает одну веб-страницу для ссылок, затем создает потоки, которые выполняют очистку подстраниц.

Вот что делает поток:

Dim client As New WebClient()
Dim stream As Stream = client.OpenRead(_Address)
Dim streamReader As New StreamReader(stream, True)
_Content = streamReader.ReadToEnd()
streamReader.Close()
streamReader.Dispose()
stream.Close()
stream.Dispose()
client.Dispose()

I 'мы заметили, что иногда (обычно при одновременном выполнении большего количества потоков) поток генерирует исключение.Это происходит случайным образом, исключение выдается на client.OpenRead, и оно говорит "Value cannot be null. Parameter name: address".У меня также есть здесь попытка ... поймать, поэтому я поставил точку останова в блоке перехвата, и кажется, что _Address является действительным в то время, но код выдает исключение.

_Address - это поле защищенного класса, к которому другие потоки не могут получить доступ.

Точное сообщение:

"Значение не может быть нулевым. Имя параметра: адрес".

Исключение составляет System.ArgumentNullException.

Трассировка стека:

в System.Net.WebClient.OpenRead (строковый адрес) в MyAppName.Scraper.Scrape () в MyAppFolder \ Scraper.vb: строка 96

Есть ли у вас какие-либо предложения по устранению проблемы?Заранее спасибо.

1 Ответ

2 голосов
/ 27 сентября 2010

Внутренняя реализация для WebClient.OpenRead(string address) просто:

public Stream OpenRead(string address)
{
    if (address == null)
    {
        throw new ArgumentNullException("address");
    }
    return this.OpenRead(this.GetUri(address));
}

поэтому _Address должно быть нулевым, когда оно передается.

Может быть, попробовать что-то вроде этого:

private string _address;
private string _Address
{
    get
    {
        if(_address == null)
            throw new ArgumentNullException("_Address was never set and is still null!");
        return _address;
    }
    set
    {
        if(value == null)
            throw new ArgumentNullException("_Address can not be null!");
        _address = value;
    }
}

Так что, в принципе, если что-то попытается установить для _Address значение NULL, вы получите ошибку сразу же, когда это произойдет, и сможете увидеть в стеке вызовов, где оно установлено на NULL.

...