如何让在.NET 4.0中正在运行的任务列表(how to get a list of runnin

2019-07-29 15:47发布

我试图让所有当前正在运行的任务列表。 是否.NET 4.0的任务API提供这样的功能? 或者,唯一的选择是明确的存储任务,在一个单独的收藏?

Answer 1:

我想你需要TaskScheduler.GetScheduledTasks方法,但是:

  1. 它的保护
  2. MSDN说,它应该只用于调试使用
  3. 据我所知,这种方法只能通过ThreadPoolTask​​Scheduler实施,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()); 
         }
      }
   }
}


文章来源: how to get a list of running tasks in .net 4.0