我想遍历URL列表并检查每个URL,如果网站已关闭或未使用多个线程。循环遍历列表并创建多线程
我的方法:
当一个线程完成_iRunningThreads
属性,都会递减。
我的问题是:外while while循环阻止了所有“while (_lURLs.Count > 0)
”。 在outer while循环中添加一个Application.DoEvents()
可以帮助,但我想使用c#库中的代码,其中Application.DoEvents()
不可用。
谢谢你的帮助。
我想遍历URL列表并检查每个URL,如果网站已关闭或未使用多个线程。循环遍历列表并创建多线程
我的方法:
当一个线程完成_iRunningThreads
属性,都会递减。
我的问题是:外while while循环阻止了所有“while (_lURLs.Count > 0)
”。 在outer while循环中添加一个Application.DoEvents()
可以帮助,但我想使用c#库中的代码,其中Application.DoEvents()
不可用。
谢谢你的帮助。
我认为在这种情况下使用.NET ThreadPool将是一个好主意,如果这些任务需要相当短的时间才能完成。
退房:http://msdn.microsoft.com/en-us/library/4yd16hza.aspx
这使您可以简化您的代码位的线程池自动管理工作线程的数量。您只需拨打ThreadPool.QueueUserWorkItem
即可获取每个网址,并增加正在运行的任务计数器。将项目排入ThreadPool
不会阻塞UI线程。
让ThreadPool任务递减计数器(就像现在一样),并且当计数器变为零(所有任务都已经运行)时调用回调函数,以便您的主代码知道何时处理了所有URL。您可以更新UI或您想从该回调中完成的其他任何事情。
而不是自己管理线程,您可以使用TPL。
另外,如果你正在使用.NET Framework 4.5,你甚至可以添加异步/等待和WhenAll方法,以防止拦截...
这里是一个小例子:
private async Task CheckUrl()
{
List<Task> tasks = new List<Task>();
string url = GetNextUrl();
while (!String.IsNullOrEmpty(url))
{
tasks.Add(Task.Run(() => CheckWebSite(url)));
url = GetNextUrl();
}
await Task.WhenAll(tasks);
// All tasks have finished...
}
此操作从外面看,是一个阻塞操作。只需从主程序的Thread(Backgroundworker)上运行它。 – 2013-04-06 12:38:11
您的CheckWebsite方法实际在做什么?看起来异步方法比线程更适合这种类型的任务。 – 2013-04-06 12:39:06
请参阅http://stackoverflow.com/questions/15850633/c-sharp-threading-issue-best-practises – Filip 2013-04-06 12:46:32