2014-11-25 54 views
0

假設我想下載任務並行庫的多個文件,現在我想要顯示在從VS2010 IDE調試時有多少線程正在工作?這是一個使用TPL下載許多文件的代碼片段。如何查看有多少線程正在完成我的任務TPL?

var list = new[] 
{ 
    "http://google.com", 
    "http://yahoo.com", 
    "http://stackoverflow.com" 
}; 

var tasks = Parallel.ForEach(list, 
     s => 
     { 
      using (var client = new WebClient()) 
      { 
       Console.WriteLine("starting to download {0}", s); 
       string result = client.DownloadString((string)s); 
       Console.WriteLine("finished downloading {0}", s); 
      } 
     }); 

請指導我或重定向到任何文章從哪裏我可以獲取知識,看看有多少線程正在運行來完成我的任務。

+4

爲什麼這對你很重要?同樣喜歡'DownloadStringTaskAsync'超過同步版本。因爲操作本質上是異步的。 – 2014-11-25 08:24:39

+0

如果您遇到VS 2010和.NET 4.0,應考慮升級到免費的Visual Studio 2013社區(與VS Pro相同),並開始使用添加'DownloadStringTaskAsync'的.NET 4.5。即使你必須支持XP(不運行4.5),你也可以將BCL Async和HttpClient包添加到VS 2013中。 – 2014-11-26 13:58:52

+0

這還不清楚「即使你必須支持XP(不支持4.5)你可以將BCL Async和HttpClient包添加到VS 2013「你想說什麼。 – Thomas 2014-11-26 14:01:56

回答

2

Parallel.ForEach將默認使用ThreadPool作爲其基礎的線程池,除非你通過一個實例ParallelOptions(並通過一個定製TaskScheduler)時,另行指定。您可以監視線程池,並通過ThreadPool.GetAvailableThreads減去ThreadPool.GetMaxThreads來查看當前正在使用多少線程,但是這會告訴您線程池當前正在使用多個線程,該線程不僅用於運行當前循環,還用於其他內部工作你的程序。

更具體地講,您可以使用Thread.CurrentThread.ManagedThreadId來獲取當前執行ThreadId

using (var client = new WebClient()) 
{ 
    Console.WriteLine("Currently running on thread id: {0}", 
         Thread.CurrentThread.ManagedThreadId); 
    Console.WriteLine("starting to download {0}", s); 
    string result = client.DownloadString((string)s); 
    Console.WriteLine("finished downloading {0}", s); 
} 

現在,作爲一個側面說明你的問題,做IO限制的工作不需要的線程在所有使用因爲它本質上是異步的。這意味着使用Parallel.ForEach可能會導致使用線程池線程更簡單地阻塞未決IO請求的開銷。

你可以做的,而不是爲執行這些要求同時

string[] list = new[] 
{ 
    "http://google.com", 
    "http://yahoo.com", 
    "http://stackoverflow.com" 
}; 

using (WebClient client = new WebClient()) 
{ 
    var webRequestTasks = list.Select(address => client 
               .DownloadStringTaskAsync(address)) 
               .ToList(); 
    await Task.WhenAll(webRequestTasks); 
} 

這種方式有沒有阻塞的線程和你的HTTP請求被同時執行。

+0

我想知道VS2010/2012 IDE中是否存在任何可視化工具,這些工具可以幫助我查看有多少線程可以同時完成我的任務,以便從IDE執行上述代碼? – Thomas 2014-11-25 08:58:33

+0

如果設置斷點,您可以使用* Debug * - > * Windows * - > * Threads *來查看當前正在運行的線程。但它不會爲你總結線程。 – 2014-11-25 09:03:56

+0

有沒有什麼好的免費的可視化工具。分享名稱和網址,如果你知道....所以我可以下載它。謝謝 – Thomas 2014-11-25 09:35:56

相關問題