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

C# 如何在异步多线程爬虫中锁定回调类?,c#,.net,http,asynchronous,C#,.net,Http,Asynchronous,我编写了一个爬虫程序,它使用用户加载的单词列表在一个站点上执行多个搜索,并解析每个结果页面 为了实现这一点,我编写了一个main方法,它在单词列表中循环,异步发送多个http get请求(使用ThreadPool.QueueUserWorkItem)以获取当前单词的所有页面结果,直到找不到更多结果,然后移到下一个单词 回调函数使用静态方法访问公共静态类,该静态方法解析返回的html并相应地执行操作。现在,每次有东西访问该方法时,我都会将其锁定在类类型上: static class Par

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

为了实现这一点,我编写了一个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
        }
    }
}
因此,我的问题是:如何更有效地锁定类并在释放锁时通知等待的线程,还是不让解析器成为静态类,而是让每个线程池线程实例化它自己的此类实例

非常感谢你的帮助


-仍在学习

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

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

如果我在CallbackMethod\u ParseData中调用另一个包含List对象的静态类(Globals),怎么样。此方法称为“Globals.AddToList”,并使用lock(ListObj)。我怎样才能使它更有效率,如果有的话?我不相信你能。在这种情况下,听起来您实际上是在访问一个共享资源,因此在这种情况下需要一个锁。我不太担心效率,只担心线程的正确处理。对不起,我是新来的……我不能投票给任何人,因为我没有足够的重复性。我现在感觉自己像个混蛋哈哈。很抱歉,我忘了投票有最低分数要求(