2013-04-06 261 views
0

我想遍历URL列表并检查每个URL,如果网站已关闭或未使用多个线程。循环遍历列表并创建多线程

我的方法:

​​

当一个线程完成_iRunningThreads属性,都会递减。

我的问题是:外while while循环阻止了所有“while (_lURLs.Count > 0)”。 在outer while循环中添加一个Application.DoEvents()可以帮助,但我想使用c#库中的代码,其中Application.DoEvents()不可用。

谢谢你的帮助。

+0

此操作从外面看,是一个阻塞操作。只需从主程序的Thread(Backgroundworker)上运行它。 – 2013-04-06 12:38:11

+3

您的CheckWebsite方法实际在做什么?看起来异步方法比线程更适合这种类型的任务。 – 2013-04-06 12:39:06

+1

请参阅http://stackoverflow.com/questions/15850633/c-sharp-threading-issue-best-practises – Filip 2013-04-06 12:46:32

回答

1

我认为在这种情况下使用.NET ThreadPool将是一个好主意,如果这些任务需要相当短的时间才能完成。

退房:http://msdn.microsoft.com/en-us/library/4yd16hza.aspx

这使您可以简化您的代码位的线程池自动管理工作线程的数量。您只需拨打ThreadPool.QueueUserWorkItem即可获取每个网址,并增加正在运行的任务计数器。将项目排入ThreadPool不会阻塞UI线程。

让ThreadPool任务递减计数器(就像现在一样),并且当计数器变为零(所有任务都已经运行)时调用回调函数,以便您的主代码知道何时处理了所有URL。您可以更新UI或您想从该回调中完成的其他任何事情。

3

而不是自己管理线程,您可以使用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... 

    }