.NET 资源监视

写在前面

 在 Microsoft.Extensions.Diagnostics.ResourceMonitoring 包提供了一系列定制 API,专用于监视 .NET 应用程序的资源利用率。

为了让控制台输出的样式更美观,可以安装一下Spectre.Console这个包

本例主要通过 IResourceMonitor 来获取资源状态信息,该接口支持检索与 CPU 和内存使用情况相关的数据,并且当前与 Windows 和 Linux 平台兼容。

示例代码中用到的 Microsoft.Extensions.Logging 类库也需要通过NuGet安装一下。 

代码实现

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.ResourceMonitoring;
using Microsoft.Extensions.Logging;
using Spectre.Console;

public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection()
      .AddLogging()
      .AddResourceMonitoring();

        var provider = services.BuildServiceProvider();

        var monitor = provider.GetRequiredService<IResourceMonitor>();
        _ = StartMonitoringAsync(monitor, new CancellationToken());

        Console.ReadKey();
    }
     
    static async Task StartMonitoringAsync(IResourceMonitor monitor, CancellationToken cancellationToken)
    {
        var table = new Table()
            .Centered()
            .Title("Resource Monitoring", new Style(foreground: Color.Purple, decoration: Decoration.Bold))
            .Caption("Updates every three seconds. *GTD: Guaranteed ", new Style(decoration: Decoration.Dim))
            .RoundedBorder()
            .BorderColor(Color.Cyan1)
            .AddColumns(
            [
                new TableColumn("Time").Centered(),
                new TableColumn("CPU %").Centered(),
                new TableColumn("Memory %").Centered(),
                new TableColumn("Memory (bytes)").Centered(),
                new TableColumn("GTD / Max Memory (bytes)").Centered(),
                new TableColumn("GTD / Max CPU (units)").Centered(),
            ]);

        await AnsiConsole.Live(table)
            .StartAsync(async ctx =>
            {
                var window = TimeSpan.FromSeconds(3);
                while (cancellationToken.IsCancellationRequested is false)
                {
                    var utilization = monitor.GetUtilization(window);
                    var resources = utilization.SystemResources;

                    table.AddRow(
                        [
                            $"{DateTime.Now:T}",
                            $"{utilization.CpuUsedPercentage:p}",
                            $"{utilization.MemoryUsedPercentage:p}",
                            $"{utilization.MemoryUsedInBytes:#,#}",
                            $"{resources.GuaranteedMemoryInBytes:#,#} / {resources.MaximumMemoryInBytes:#,#}",
                            $"{resources.GuaranteedCpuUnits} / {resources.MaximumCpuUnits}",
                        ]);

                    ctx.Refresh();
                    await Task.Delay(window);
                }
            });

        Console.CancelKeyPress += (_, e) =>
        {
            e.Cancel = true;
        };
    }

}

调用示例

相关推荐

  1. 【WPF.NET开发】WPF中的XAML资源

    2024-01-22 13:36:01       45 阅读
  2. NFT学习资料整理

    2024-01-22 13:36:01       24 阅读
  3. Linux vmstat命令:监控系统资源

    2024-01-22 13:36:01       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-22 13:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-22 13:36:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-22 13:36:01       82 阅读
  4. Python语言-面向对象

    2024-01-22 13:36:01       91 阅读

热门阅读

  1. 计算机通信:HTTP协议

    2024-01-22 13:36:01       55 阅读
  2. 编程笔记 html5&css&js 050 CSS表格2-1

    2024-01-22 13:36:01       50 阅读
  3. Golang爬虫技术

    2024-01-22 13:36:01       53 阅读
  4. 用go语言删除重复文件

    2024-01-22 13:36:01       58 阅读
  5. Vue.js:构建用户界面的渐进式框架

    2024-01-22 13:36:01       42 阅读
  6. 华为网络设备常用命令大全

    2024-01-22 13:36:01       71 阅读
  7. Vue 批量注册全局组件

    2024-01-22 13:36:01       56 阅读
  8. props传值

    2024-01-22 13:36:01       57 阅读
  9. Spring与Spring Boot:区别与Spring Boot的实战示例

    2024-01-22 13:36:01       48 阅读
  10. MySQL的MVCC

    2024-01-22 13:36:01       46 阅读