【问题标题】:How to list all the tasks in a console app?如何列出控制台应用程序中的所有任务?
【发布时间】:2018-08-01 09:06:49
【问题描述】:

我需要它来调试,通过代码而不是通过某些 UI 工具。

TaskScheduler 类具有返回ThreadPoolTaskScheduler 的属性Current,但它是内部的,显然在taskchd.dll 中。

TaskSchedulerGetScheduledTasks() 也受到保护 换句话说,您不能使用它来列出任务。我需要列出所有任务,包括代表我的控制台应用程序在基本 NET 代码中间接创建的任务

【问题讨论】:

  • 您是否尝试过使用反射来访问内部?我不建议将其用于生产,只是说。
  • TaskScheduler 有两个内部方法供调试器使用,这就是它在 VS 中实现 Debug > Windows > Tasks 工具窗口的方式。静态 TaskScheduler[] GetTaskSchedulersForDebugger() 允许您迭代所有调度程序,Task[] GetScheduledTasksForDebugger 允许您迭代每个调度程序的所有任务。使用反射来调用它们。请注意,在程序运行并主动创建/执行任务时调用它们并不是特别安全,调试器不会出现问题,因为它会冻结程序。

标签: c# taskscheduler


【解决方案1】:

您可以使用System.Reflection api 来实现。您可以通过为反射方法提供适当的 BindingFlags 来查询非公共成员:

var type = typeof(TaskScheduler);
var fieldinfo = type.GetProperty("Current", BindingFlags.Instance | BindingFlags.NonPublic);
var methodInfo = type.GetMethod("GetScheduledTasks", BindingFlags.Instance | BindingFlags.NonPublic));

..获取属性和方法的元数据后,您可以调用PropertyInfo.GetValueMethodInfo.Invoke

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2021-12-20
    • 2012-05-15
    • 2022-01-14
    • 2013-01-13
    相关资源
    最近更新 更多