我想遍歷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