我试图让所有当前正在运行的任务列表。 是否.NET 4.0的任务API提供这样的功能? 或者,唯一的选择是明确的存储任务,在一个单独的收藏?
Answer 1:
我想你需要TaskScheduler.GetScheduledTasks方法,但是:
- 它的保护
- MSDN说,它应该只用于调试使用
- 据我所知,这种方法只能通过ThreadPoolTaskScheduler实施,SynchronizationContextTaskScheduler始终返回null
所以,我想你应该尝试实现自己的TaskScheduler实现自己的目标。
Answer 2:
当您创建一个任务,默认情况下,任务计划在运行的线程池线程。 所以,你可以通过使用获得的正在运行的任务数ThreadPool.GetMaxThreads和ThreadPool.GetAvailableThreads方法。
private static int GetWorkingThreads() {
int maxThreads;
int completionPortThreads;
ThreadPool.GetMaxThreads(out maxThreads, out completionPortThreads);
int availableThreads;
ThreadPool.GetAvailableThreads(out availableThreads, out completionPortThreads);
return maxThreads - availableThreads;
}
Answer 3:
为什么你想找到正在运行的任务列表? 除了调试,你不应该使用这些信息。 在任何情况下,它们是在定于执行的任务和实际执行的任务列表之间的差异。
由于生锈写道,你可以从TaskScheduler.GetScheduledTasks方法计划任务数。 该方法是抽象的,因此必须由所有TaskSchedulers实现。
有多少任务实际执行依赖于执行的TaskScheduler。 默认的任务调度器使用线程池,在这种情况下,你应该检查ThreadPool.GetAvailableThreads和ThreadPool.GetMaxThreads近似的执行任务的数量。
还有的正在运行的任务没有实际列表,甚至当你使用默认的TaskScheduler。 调度基本上分配给一个线程池任务和叶实际执行池(实际上,它调用Task.ExecuteEntry私有方法)。 它没有必要保留的正在运行的任务列表。
如果你想为调试目的正在运行的任务信息,您可以利用的事件跟踪为TPL的Windows事件 。 不幸的是,开始做任务和任务完成的事件不被记录在案。 我发现他们在浏览Task.ExecuteEntry的定义与dotPeek。
我发现一篇文章探讨了第三方物流的事件 ,但我不知道它是值得的麻烦。 除非你正在写自己的调试器,它似乎太麻烦了。
如果你只是去运行的任务列表中,也许你应该写自己的TaskScheduler并覆盖TryExecute和TryExecuteInternal拦截每个任务的执行,并且将每个任务列表中。 这可以得到昂贵虽然,你必须定期做一些清理,以从列表中删除完成的任务,而无需使用延续(这将在列表中自己结束)。
Answer 4:
有在MSDN的好文章http://msdn.microsoft.com/en-us/library/ms997649.aspx你需要描述得非常详细的一切。
编辑:perhabs这将帮助:
using System;
using System.Diagnostics;
class MainClass
{
public static void Main()
{
Process[] allProcs = Process.GetProcesses();
foreach(Process proc in allProcs)
{
ProcessThreadCollection myThreads = proc.Threads;
Console.WriteLine("process: {0}, id: {1}", proc.ProcessName, proc.Id);
foreach(ProcessThread pt in myThreads)
{
Console.WriteLine(" thread: {0}", pt.Id);
Console.WriteLine(" started: {0}", pt.StartTime.ToString());
Console.WriteLine(" CPU time: {0}", pt.TotalProcessorTime);
Console.WriteLine(" priority: {0}", pt.BasePriority);
Console.WriteLine(" thread state: {0}", pt.ThreadState.ToString());
}
}
}
}