作为一名开发人员,我想监控 TaskScheduler 中任务队列中的工作大小(和进度),以便我可以评估在生产负载下经历的减速是否是由于计划任务的规模或可能停止。
通常我会简单地附加调试器并检查任务大小,但是:
我已经通过文档并发现
我很乐意去:
我不想做的事情是:
最佳答案
我可以使用反射和 GetScheduledTasksForDebugger 检索信息:
public static class ScheduledTaskAccess
{
public static Task[] GetScheduledTasksForDebugger(this TaskScheduler ts)
{
var mi = ts.GetType().GetMethod("GetScheduledTasksForDebugger", BindingFlags.NonPublic | BindingFlags.Instance);
if (mi == null)
return null;
return (Task[])mi.Invoke(ts, new object[0]);
}
public static TaskScheduler[] GetTaskSchedulersForDebugger()
{
var mi = typeof(TaskScheduler).GetMethod("GetTaskSchedulersForDebugger", BindingFlags.NonPublic | BindingFlags.Static);
if (mi == null)
return null;
return (TaskScheduler[])mi.Invoke(null, new object[0]);
}
}
使用自定义 IEqualityComparer 我能够维持他们排队的时间。非常有用的元信息:)
现在我只希望有一些关于可以访问的任务的统计信息,CPU 时间花费,空闲时间,任务切换计数,......
关于.net - 如何监视 .NET TaskScheduler 中的任务队列(跨 AppDomain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29549854/