C# 如何查看有多少线程正在工作以完成我的任务TPL?
假设我想用task parallel library下载多个文件,现在我想可视化在VS2010 IDE调试时有多少线程在工作?下面是一个代码片段,它使用TPL下载了许多文件C# 如何查看有多少线程正在工作以完成我的任务TPL?,c#,.net,multithreading,task-parallel-library,async-await,C#,.net,Multithreading,Task Parallel Library,Async Await,假设我想用task parallel library下载多个文件,现在我想可视化在VS2010 IDE调试时有多少线程在工作?下面是一个代码片段,它使用TPL下载了许多文件 var list = new[] { "http://google.com", "http://yahoo.com", "http://stackoverflow.com" }; var tasks = Parallel.ForEach(list, s =>
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);
}
});
请引导我或将我重定向到任何文章,从中我可以获得知识,以查看有多少线程正在运行以完成我的任务。
Parallel。ForEach
将默认使用线程池作为其底层线程池,除非在传递实例ParallelOptions
(并传递自定义的任务调度程序
)。您可以监视线程池,并通过减去线程池来查看当前使用的线程数。GetMaxThreads
与线程池。GetAvailableThreads
,但这将告诉您,线程池当前使用了许多线程,线程池不仅用于运行当前循环,还用于运行内部的其他工作节目
更具体地说,您可以使用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请求并发执行。
为什么对您更重要?也更喜欢<代码> DownloadStringTaskAsync <代码>过同步版本。因为操作本质上是异步的。如果您被VS 2010和.NET 4卡住,则应该考虑升级到自由视觉ST。udio 2013社区(与VS Pro相同),并开始使用.NET 4.5,它添加了下载StringTaskAsync
。即使您必须支持XP(不运行4.5),您也可以将BCL Async和HttpClient包添加到VS 2013。这并不清楚“即使您必须支持XP(不运行4.5)”您可以将BCL Async和HttpClient包添加到VS 2013“你想说什么。我想知道VS2010/2012 IDE中是否存在任何可视化工具,可以帮助我查看当我从IDE执行上述代码时,有多少线程被分配来同时完成我的任务?如果你设置了断点,你可以使用Debug->Windows->Threads来查看你当前运行的线程。但它不会求和线程为你。有任何好的免费可视化工具。共享名称和url,如果你知道…这样我可以下载它。谢谢你可以使用Visual Studio的。