重学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 @ 2023-05-31 20:07  敖毛毛  阅读(222)  评论(0编辑  收藏  举报