作为开发人员,我想监视TaskSchedulers中任务队列中工作的大小(和进度),以便我可以评估生产负载下经历的减速是由于计划任务的大小还是停滞.
通常我会简单地附加调试器并检查任务大小,但是:
>该应用程序在单声道和生产中运行,因此我无法使用visual studio附加它
>我想提供关于这些数据的分析输出作为监测服务的健康监测输入
我已经通过文档找到了
> TaskScheduler.GetScheduledTasks,将此信息提供给调试器.它受到保护(我可以规避),但似乎也需要一些我不能尊重的冻结线程的保证.但是,我愿意使用不一致的数据.
> how to get a list of running tasks in .net 4.0.其中重点关注正在运行的任务,这对我来说并不那么有趣.我对积压的大小以及工作是否进展感兴趣.
我很乐意去:
>使用为其他目的而设计的代码(例如用于调试器)
>接受我得到的数据不一致(这是用于统计和分析)
我不想做的事情是:
>为每个创建的任务添加跟踪.
>部分代码是第三方,无法重构
>有很多代码,并且将其注入其中比使用它无法说明进展情况更糟糕.
>使用自定义TaskScheduler
>部分代码是第三方,无法重构
>部分代码使用TaskSchedulers设置线程优先级和最大并发.在监测方面考虑因素将是非常糟糕的.
最佳答案 不幸的是,TaskScheduler.GetScheduledTasks仅用于调试器,没有直接的方法来获取计划任务.
但是MSDN说(source):
Developers who are implementing custom debuggers shouldn’t call this method directly, but should use the internal wrapper method
GetScheduledTasksForDebugger
instead:internal Task[] GetScheduledTasksForDebugger()
. This wrapper method returns an array of tasks instead of an enumerable. To retrieve a list of active schedulers, use the internal methodinternal static TaskScheduler[] GetTaskSchedulersForDebugger()
. This static method returns an array of all active TaskScheduler instances. You can then useGetScheduledTasksForDebugger
on each scheduler instance to retrieve its list of scheduled tasks.
那么为什么不使用反射呢?这是实现您想要的安全且简单的方法,因为GetScheduledTasksForDebugger将来会存在,它专为调试而设计,可能用于分析.