gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:20:27 27 4
gpt4 key购买 nike

我正在围绕我正在开发的服务器应用程序制作一个包装器,它显示调试信息,例如内存、CPU 使用率、线程和任务、堆信息等,并提供一些启动和停止服务器的方法。

Visual Studio 有一个方便的任务窗口,用于调试异步应用程序。它提供以下信息:ID、状态、开始时间、持续时间和位置,以及位置。 是否有可能从我的应用程序内部获取相同的信息?我愿意接受各种反射(reflection)、黑客攻击和未记录的脏东西来获取这些信息,因为它不是生产代码。

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

Visual Studio 任务窗口: Visual Studio Task Window

最佳答案

TaskScheduler 有一个托管包装器在 CodePlex 上找到。

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

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、Status、Start time、Duration和Location信息是否可用,我不确定。

但是看看 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();
}
}

关于c# - 如何枚举所有任务,如 Visual Studio 任务窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com