如何枚举所有任务,如Visual Studio任务窗口

时间:2016-05-17 21:30:10

标签: c# .net multithreading

我正在围绕我正在开发的服务器应用程序进行包装,它显示调试信息,如内存,cpu使用情况,线程和任务,堆信息等,并提供启动和停止服务器的一些方法。

Visual Studio有一个方便的任务窗口,用于调试异步应用程序。它提供以下信息:Id,状态,开始时间,持续时间和位置以及位置。 是否有可能从我的应用程序中获取相同的信息?我愿意接受各种反射,黑客和无证件的脏东西以获取此信息,因为它不是生产代码。

我尝试在GetScheduledTasksForDebugger对象(这是一个TaskScheduler.Default对象)上执行内部方法ThreadPoolTaskScheduler,但是返回0个任务,即使Visual Studio任务窗口显示了至少安排了两项任务。

Visual Studio任务窗口: Visual Studio Task Window

1 个答案:

答案 0 :(得分:0)

CodePlex上有TaskScheduler的托管包装。

使用该包装器可以枚举任务:

using System;
using Microsoft.Win32.TaskScheduler;

namespace ListTasks
{
    class Program
    {
        static void EnumFolderTasks(TaskFolder fld)
        {
            foreach (Task task in fld.Tasks)
                DisplayTask(task);

            foreach (TaskFolder sfld in fld.SubFolders)
                EnumFolderTasks(sfld);
        }

        static void DisplayTask(Task t)
        {
            Console.WriteLine("Task: {0, -60} Active: {1, -5} Enabled: {2, -5}", 
                              t.Name, t.IsActive, t.Enabled);
        }

        static void Main(string[] args)
        {
            using (TaskService ts = new TaskService())
            {
                EnumFolderTasks(ts.RootFolder);
            }
        }
    }
}

关于Id,状态,开始时间,持续时间和位置信息是否可用,我不确定。

但是看看Task对象的定义它确实包含了大量的信息,乍一看大部分信息似乎都可用:

编辑:添加了名称空间,以消除对Task对象的一些疑惑。

namespace Microsoft.Win32.TaskScheduler
{ 
    public class Task : IDisposable
    {
        public TaskDefinition Definition { get; }
        public bool Enabled { get; set; }
        public TaskFolder Folder { get; }
        public bool IsActive { get; }
        public DateTime LastRunTime { get; }
        public int LastTaskResult { get; }
        public string Name { get; }
        public DateTime NextRunTime { get; }
        public int NumberOfMissedRuns { get; }
        public string Path { get; }
        public bool ReadOnly { get; }
        public GenericSecurityDescriptor SecurityDescriptor { get; set; }
        public virtual TaskState State { get; }
        public TaskService TaskService { get; }
        public string Xml { get; }
        public void Dispose();
        public void Export(string outputFileName);
        public TaskSecurity GetAccessControl();
        public TaskSecurity GetAccessControl(AccessControlSections includeSections);
        public RunningTaskCollection GetInstances();
        public DateTime GetLastRegistrationTime();
        public DateTime[] GetRunTimes(DateTime start, DateTime end, uint count = 0);
        public string GetSecurityDescriptorSddlForm(SecurityInfos includeSections = SecurityInfos.Owner | SecurityInfos.Group | SecurityInfos.DiscretionaryAcl);
        public void RegisterChanges();
        public RunningTask Run(params string[] parameters);
        public RunningTask RunEx(TaskRunFlags flags, int sessionID, string user, params string[] parameters);
        public void SetAccessControl(TaskSecurity taskSecurity);
        public void SetSecurityDescriptorSddlForm(string sddlForm, TaskSetSecurityOptions options = TaskSetSecurityOptions.None);
        public void ShowPropertyPage();
        public void Stop();
        public override string ToString();
    }
}