重学c#系列——DiagnosticListener [三十五]

前言

简单介绍一下DiagnosticListener,一个比较常见的事件通知模型,可以说是事件发布订阅模型,常用于监控。

正文

直接编写代码:


using System.Diagnostics;

public class program
{
    public static void Main(string[] args)
    {
        // 创建一个DiagnosticListener实例
        DiagnosticListener listener = new DiagnosticListener("MyListener");

        // 在启动和停止事件上记录信息
        listener.Subscribe(new MyListenerObserver());

        // 发出事件并记录
        listener.Write("MyEvent", new { Message = "Hello World" });

        Console.Read();
    }
}

class MyListenerObserver : IObserver<KeyValuePair<string, object>>
{
    public void OnCompleted()
    {
    }

    public void OnError(Exception error)
    {
        Console.WriteLine($"Error: {error.Message}");
    }

    public void OnNext(KeyValuePair<string, object> value)
    {
        Console.WriteLine($"EventName: {value.Key} - Payload: {value.Value}");
    }
}

结果:

但是一般情况下,不这么写。

一般这样写:

public class program
{
    public static void Main(string[] args)
    {
        DiagnosticListener.AllListeners.Subscribe(new MyObserver());

        Test test = new Test();
        test.Run();

        Console.Read();
    }
}

class Test
{
    static DiagnosticListener listener = new DiagnosticListener("MyListener");

    public Test()
    {
        
    }

    public void Run()
    {
        // 发出事件并记录
        listener.Write("MyEvent", new { Message = "Hello World" });
    }
}

class MyObserver : IObserver<DiagnosticListener>
{
    private IDisposable subscription;

    public void OnCompleted()
    {
        subscription.Dispose();
    }

    public void OnError(Exception error)
    {
        Console.WriteLine($"Error: {error.Message}");
    }

    public void OnNext(DiagnosticListener listener)
    {
        if (listener.Name == "MyListener")
        {
            subscription = listener.Subscribe(new MyListenerObserver());
        }
    }
}

class MyListenerObserver : IObserver<KeyValuePair<string, object>>
{
    public void OnCompleted()
    {
    }

    public void OnError(Exception error)
    {
        Console.WriteLine($"Error: {error.Message}");
    }

    public void OnNext(KeyValuePair<string, object> value)
    {
        Console.WriteLine($"EventName: {value.Key} - Payload: {value.Value}");
    }
}

这样做的好处就是:比如Test 只需要关注自己的业务实现和事件发送,其他的外部监控订阅即可。

此系列逐步更新,这个用的比较多,但是还有人没用过所以写下。

posted @   敖毛毛  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-05-31 重新整理 .net core 实践篇————配置系统——军令(命令行)[六]
2021-05-31 重新整理 .net core 实践篇————配置系统之盟约[五]
2020-05-31 mysql 重新整理——索引优化explain字段介绍一 [九]
2020-05-31 mysql 重新整理——索引优化explain简单介绍 [八]
2020-05-31 mysql 重新整理——索引简介[七]
点击右上角即可分享
微信分享提示