C# 如何在异步多线程爬虫中锁定回调类?
我编写了一个爬虫程序,它使用用户加载的单词列表在一个站点上执行多个搜索,并解析每个结果页面 为了实现这一点,我编写了一个main方法,它在单词列表中循环,异步发送多个http get请求(使用ThreadPool.QueueUserWorkItem)以获取当前单词的所有页面结果,直到找不到更多结果,然后移到下一个单词 回调函数使用静态方法访问公共静态类,该静态方法解析返回的html并相应地执行操作。现在,每次有东西访问该方法时,我都会将其锁定在类类型上:C# 如何在异步多线程爬虫中锁定回调类?,c#,.net,http,asynchronous,C#,.net,Http,Asynchronous,我编写了一个爬虫程序,它使用用户加载的单词列表在一个站点上执行多个搜索,并解析每个结果页面 为了实现这一点,我编写了一个main方法,它在单词列表中循环,异步发送多个http get请求(使用ThreadPool.QueueUserWorkItem)以获取当前单词的所有页面结果,直到找不到更多结果,然后移到下一个单词 回调函数使用静态方法访问公共静态类,该静态方法解析返回的html并相应地执行操作。现在,每次有东西访问该方法时,我都会将其锁定在类类型上: static class Par
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)。我怎样才能使它更有效率,如果有的话?我不相信你能。在这种情况下,听起来您实际上是在访问一个共享资源,因此在这种情况下需要一个锁。我不太担心效率,只担心线程的正确处理。对不起,我是新来的……我不能投票给任何人,因为我没有足够的重复性。我现在感觉自己像个混蛋哈哈。很抱歉,我忘了投票有最低分数要求(