Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查看有多少线程正在工作以完成我的任务TPL?_C#_.net_Multithreading_Task Parallel Library_Async Await - Fatal编程技术网

C# 如何查看有多少线程正在工作以完成我的任务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 =>

假设我想用task parallel library下载多个文件,现在我想可视化在VS2010 IDE调试时有多少线程在工作?下面是一个代码片段,它使用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);
            }
        });

请引导我或将我重定向到任何文章,从中我可以获得知识,以查看有多少线程正在运行以完成我的任务。

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的。