gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:10:46 24 4
gpt4 key购买 nike

作为一名开发人员,我想监控 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/

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