1

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

为此,我编写了一个循环遍历单词列表的 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 线程实例化它自己的此类实例?

非常感谢你的帮助,

-仍然在学习

4

2 回答 2

1

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

于 2012-05-22T16:51:32.777 回答
1

查看您的代码,我认为根本没有任何理由拥有锁。

于 2012-05-22T16:52:11.240 回答