.net - 如何监视 .NET TaskScheduler 中的任务队列(跨 AppDomain)

标签 .net task-parallel-library task monitoring

作为一名开发人员,我想监控 TaskScheduler 中任务队列中的工作大小(和进度),以便我可以评估在生产负载下经历的减速是否是由于计划任务的规模或可能停止。

通常我会简单地附加调试器并检查任务大小,但是:

  • 该应用程序在单声道和生产环境下运行,因此我无法使用 Visual Studio
  • 附加到它
  • 我想提供对此数据的分析输出,作为服务健康监测的监测输入

  • 我已经通过文档并发现
  • TaskScheduler.GetScheduledTasks ,它将此信息传递给调试器。它是 protected (我可以绕过),但似乎也需要一些关于我无法兑现的卡住线程的保证。但是,我愿意使用不一致的数据。
  • how to get a list of running tasks in .net 4.0 .它专注于正在运行的任务,这对我来说并不那么有趣。我对积压的大小以及工作是否正在进行中很感兴趣。

  • 我很乐意去:
  • 使用为其他目的设计的代码(例如调试器)
  • 接受我得到不一致的数据(这是用于统计和分析)

  • 我不想做的事情是:
  • 为创建的每个任务添加跟踪。
  • 部分代码是第三方代码,无法重构
  • 有很多代码,将其注入(inject)其中比不知道它的进展情况更糟糕。
  • 使用自定义 TaskScheduler
  • 部分代码是第三方代码,无法重构
  • 一些代码使用设置线程优先级和最大并发的 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/

    相关文章:

    c# - 为这个问题选择正确的数据结构 : circular linked list, 列表、数组或其他

    c# - 如何清除窗体中透明控件上的图形

    c# - 将 GetAwaiter().GetResult() 与 ServiceBusReceiver.PeekMessagesAsync 一起使用时出现 System.InvalidOperationException

    java - 管理 Spring 异步任务执行器中特定方法的线程执行数量

    c# - .Net List<T> 插入

    c# - 将 C++/CLI 转换为 C#

    c# - 如何使用新的任务并行库确保两个任务在不同的线程甚至不同的处理器上运行?

    c# - 即使在 Asp.Net 流程中使用 ConfigureAwait(false) 后也会出现死锁

    c# - 任务可用的最大线程数

    android - 如何在启动 Asynctask 10 秒后显示 toast