2013-04-06 60 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... 

    }