如何在此代码中出现此错误 - 错误:对象引用未设置为对象的实例

时间:2011-10-16 14:14:10

标签: c# multithreading thread-safety

这就是我给出函数

的错误
    var CrawlPage = Task.Factory.StartNew(() =>
{
    return crawlPage(srNewCrawledUrl);
});

var GetLinks = CrawlPage.ContinueWith(resultTask =>
{
    if (CrawlPage.Result == null)
    {
        return null;
    }
    else
    {
        return ReturnLinks(CrawlPage.Result, srNewCrawledUrl, srNewCrawledPageId);
    }

});

这是错误我真的不明白这是怎么可能的。我正在使用本地分配的变量,因此变量应该对所有线程都是线程安全的。我不对吗?

这是错误图片:enter image description here

2 个答案:

答案 0 :(得分:1)

你最好在调用之前验证InnerHtml是否为null

var GetLinks = CrawlPage.ContinueWith(resultTask =>
{
    if (CrawlPage.Result == null || CrawlPage.Result.DocumentNode == null ||  CrawlPage.Result.DocumentNode.InnerHtml == null)
    {
        return null;
    }
    else
    {
        return ReturnLinks(CrawlPage.Result, srNewCrawledUrl, srNewCrawledPageId);
    }

});

或者在ReturnLinks方法

上查看

答案 1 :(得分:1)

  

我正在使用本地分配的变量,因此变量应该对所有线程都是线程安全的。我不对吗?

您正在制作本地参考的事实并不意味着此参考指向的对象突然变为本地。其他线程(问题中没有显示?)可能仍然在错误的时刻(HtmlDocumenthdDoc.DocumentNode != null之间)改变hdDoc.DocumentNode.InnerHtml != null对象。