【问题标题】:How to get total number of .NET active or pending async task in a process?如何获取进程中.NET 活动或待处理异步任务的总数?
【发布时间】:2022-01-20 04:22:41
【问题描述】:

有什么方法可以查询IO、定时器等进程中挂起的异步任务总数吗?

为什么我需要计算等待的任务? 在具有许多异步调用的高负载服务器中,我们有数千个任务,主要是 IO、信号量、延迟等。我认为他们使用系统信号/事件或.net 中的一些资源。它帮助我优化应用程序并发现内存泄漏或消耗。确实,任务完成后会清理内存,但可能会等待很长时间;我需要知道等待任务的数量。

【问题讨论】:

  • 简短回答:不。您必须手动跟踪您的任务。
  • 为了避免XY problem,您能否详细说明您为什么要这样做?
  • @TheodorZoulias 大多数异步任务不是手动创建的,它们不是线程。许多 IO 和同步任务都是创建简单的调用,例如 Task.Delay、Stream.ReadAsync
  • @GabrielLuci 我已经更新了我的问题

标签: c# .net async-await diagnostics


【解决方案1】:

如果我理解正确:您的问题不是严格意义上的“计算Running 状态中的所有Task”,而是“评估Running 中的Task 在哪里以及如何吃资源”

要查找节流、额外消耗或内存泄漏,您可以使用 IDE 的性能分析器并将其附加到远程运行进程。

这需要一些修补才能开始生产,然后需要一些时间来适应它。但作为一种一次性的性能评估工具,可以决定要优化什么。

您还需要“查找解决方案中的所有字符串/引用”来查找您想要消除/枚举的调用类型(例如查找所有 .Delay)并优化源代码从那里开始。

您还可以进行一些日志分析并计算特定“文件打开”日志出现的次数,然后从那里进行优化。

至于严格回答“编写解决方案以计算未跟踪任务的数量”......我相信没有简单的解决方案,如果根本没有解决方案。

您可以尝试限制性地和过度设计地计算应用程序的当前文件句柄(因为您谈到了 IO)或进行一些古怪的不安全内存操作,但您仍然必须凭经验推断并决定要优化什么源代码。

【讨论】:

  • 谢谢,不过你说的是如何通过profiling工具和其他一些技巧来调试软件;我需要查看有多少任务待处理或处于活动状态;这是一个因素,还有许多其他因素,如内存使用率、线程数、CPU。所以答案是,“这是不可能的”
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 2013-08-11
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
相关资源
最近更新 更多