如何在异步多线程爬虫中锁定回调类?

时间:2012-05-22 16:47:37

标签: c# .net http asynchronous

我写了一个爬虫,它使用用户加载的单词列表在网站上执行多次搜索并解析每个结果页面。

为了实现这一点,我编写了一个main方法,循环遍历单词列表,异步发送多个http get请求(使用ThreadPool.QueueUserWorkItem)获取当前单词的所有结果页,直到找不到更多结果,并且然后转到下一个单词。

回调函数使用静态方法访问公共静态类,该方法解析返回的html并相应地执行操作。现在,每次访问方法时我都会锁定类类型:

    static class Parser
{
    public static string ResponseAsString(HttpWebResponse response)
    {
        lock (typeof(Parser))
        {
            try
            {
                Stream stream;
                if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty;
                using (var sr = new StreamReader(stream))
                    return sr.ReadToEnd();
            }
            catch { return string.Empty; }
        }
    }

    public static void CallbackMethod_ParseData(string html)
    {
        lock (typeof(Parser))
        {
            //Do some work here
        }
    }
}

所以我的问题是:如何在释放锁时更有效地锁定类并通知等待线程,或者我不应该将Parser变成静态类,而是让每个ThreadPool线程实例化它自己的这个类的实例?

非常感谢你的帮助,

- 仍然学习

2 个答案:

答案 0 :(得分:1)

锁是没有必要的。静态方法是线程安全的,只要它们不共享静态数据,根据您的示例,它们不是。

答案 1 :(得分:1)

查看您的代码,我认为没有任何理由可以获得锁定。