首页 > 编程语言 >重学c#系列——DiagnosticListener [三十五]

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

时间:2023-05-31 20:23:14浏览次数:33  
标签:Console c# void new listener DiagnosticListener 三十五 public

前言

简单介绍一下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 one rror(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 one rror(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 one rror(Exception error)
    {
        Console.WriteLine($"Error: {error.Message}");
    }

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

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

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

标签:Console,c#,void,new,listener,DiagnosticListener,三十五,public
From: https://www.cnblogs.com/aoximin/p/17440397.html

相关文章

  • 【socket】服务端与客户端简单代码
    1、C实现代码ExampleofClient-ServerPrograminC(UsingSocketsandTCP)|ProgrammingLogic  2、问题调试经验--缺少头文件导致的段错误-戴安澜式编程-博客园(84条消息)【C语言】warning:implicitdeclarationoffunction‘xxx’[-Wimplicit-function-de......
  • c#使用内存映射像处理内存一样去快速处理文件
    在.NETCore中,`System.IO.MemoryMappedFiles.MemoryMappedFile`类提供了对内存映射文件的支持。通过将文件映射到内存,你可以在应用程序中直接访问文件的内容,而不需要显式地进行文件的读取和写入操作。内存映射文件允许你将文件的特定区域映射到内存中的一个或多个`MemoryMap......
  • m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法
    1.算法仿真效果vivado2019.2仿真结果如下: 其中1为直接乘法公式计算; 2为移位法计算; 3为分布式计算; 2.算法涉及理论知识概要        人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是YCbCr色度空间表示。然而,普通......
  • AT_abc274_d 总结
    题目:AT_abc274_d链接:洛谷,AT,逐月题意给定正整数数组\(a\)和整数\(x,y\),请判断是否有\(n+1\)个点满足(一个坐标可以不止一个点):\(p_1=(0,0),p_2=(A_1,0),p_{n+1}=(x,y)\)。\(p_i\)与\(p_{i+1}(2\lei\len)\)的距离为\(a_{i}\)线段\(p_ip_{i+1......
  • [Docker] Container communcation
    ForexampleyouhavetwocontainersrunningContainerA:needtotalktoContainerBContainerB,runninganodeapplicationexportport1337 FromcontainerAdockercomposeexec-itcontainerAbashYoucanpingcontainerBnc-vcontainerB1337Tochec......
  • VulnHub-Gemini Inc: 1
    靶机地址:https://www.vulnhub.com/entry/gemini-inc-1,227/目标:Identifyanyvulnerabilitiespossiblewiththegoalofcompletesystemcompromisewithrootprivilege.Todemonstratethelevelofaccessobtained,pleaseprovidethecontentofflag.txtlocatedint......
  • docker安装
    1.官方按照链接:https://docs.docker.com/engine/install/centos/    2.配置镜像加速器登录阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors?accounttraceid=e1892dba7dce4d22a171aa260e87de01ueuh  ......
  • Autowired注解与Resource注解的区别
    两者的用法其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用.两者的共同点@Resource注解和@Autowired注解都可以用作bean的注入.在接口只有一个实现类的时候,两个注解可以互相替换,效果相同不同点:1、@Resource注解是Java自身的注解......
  • Miniconda+Pycharm中虚拟环境配置
    在安装完Miniconda后,win+r打开命令提示符,输入cmd在命令提示符输入conda,出现以下则安装成功;如果输入conda出现“不是内部或外部命令,也不是可运行的程序或批处理文件”,这样的提示说明要手动配置系统环境变量。操作:找到Miniconda的安装路径,找到Scripts,复制文件路径添加到系统path......
  • 比较 VisualVM、JMC 和异步分析器
    关键要点分析程序的性能很重要:您是否了解用于分析的开源工具有两种主要类型的分析器:采样分析器和检测分析器;了解它们的差异将帮助您选择合适的类型三种主要的开源分析器各有优缺点:一个简单的分析器(VisualVM),一个具有很多特性的可分析器(async-profiler),以及一个获取大量附加信息......