重学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 只需要关注自己的业务实现和事件发送,其他的外部监控订阅即可。
结
此系列逐步更新,这个用的比较多,但是还有人没用过所以写下。
重学c#系列——DiagnosticListener [三十五]的更多相关文章
- 重学c#系列——元组 [三十一]
		
前言 元组并不是c# 7.0的东西,早之前就有,叫做tuple.7.0加了valuetuple. 来看下元组吧,主要一些注意的地方. 正文 为什么在7.0 之前,元组用的不多呢? 因为tuple 在代 ...
 - 【Android Studio安装部署系列】三十五、从Android studio3.0.1升级到Android studio3.1.4【以及创建android p模拟器的尝试(未成功)】
		
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 因为想要使用Android P模拟器,所以需要将Android Studio升级到3.1版本以上. Android P模拟器的最低版 ...
 - 重学c#系列——非托管实例(五)
		
前言 托管资源到是好,有垃圾回收资源可以帮忙,即使需要我们的一些小小的调试来优化,也是让人感到欣慰的.但是非托管资源就显得苍白无力了,需要程序员自己去设计回收,同样有设计的地方也就能体现出程序员的设计 ...
 - 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
		
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...
 - SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
		
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
 - NeHe OpenGL教程 第三十五课:播放AVI
		
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
 - JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
		
JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...
 - .net基础学java系列(三)徘徊反思
		
.net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...
 - FreeSql (三十五)CodeFirst 自定义特性
		
比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...
 - 剑指Offer(三十五):数组中的逆序对
		
剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...
 
随机推荐
- 【规范】Apifox就应该这么玩
			
前言 缘由 好的工具就要配好的玩法 起因是最近在回顾项目时,看到了年事已高并且长时间不用的Postman,发现之前自己整理的接口文档十分混乱且没有规律.遂打开现在使用的Apifox,将本狗目前项目中使 ...
 - Redis哨兵模式搭建
			
一:哨兵主要作用 监控:监控redis主库及从库运行状态: 通知:如果redis发生故障转移,可以通过邮件通知管理员: 自动故障转移:一旦发现主库宕机,则在从库中通过选举新的master进行故障转移. ...
 - 获取一段时间内,以月/季度为单位,第N天在各个月/季度是几几年几月几号
			
/** * 获取一段时间内(可跨年),以季度为单位,第N天在各个季度是几月几号 * @param $sTime 时间戳 * @param $eTime 时间戳 * @param $number 第N天 ...
 - vagrant 多个box的操作|共享目录失败
			
本来机器上已经有一个Ubuntu的box了,今天想在安装一个centos的box,结果还折腾了很长时间. 多个机器的命令 添加box的时候需要使用名称,一个的时候可以忽略名称 vagrant box ...
 - RC4Drop算法的工作原理揭秘:加密技术的进步之路
			
RC4Drop算法起源: RC4Drop算法是RC4算法的一种改进版本,旨在解决RC4算法在长时间加密过程中可能出现的密钥流偏置问题.RC4算法由Ron Rivest于1987年设计,是一种流密码算法 ...
 - vue3 如果用ts,导出时候要用 defineComponent,这俩是配对的,为了类型的审查正确
			
vue3 如果用ts,导出时候要用 defineComponent,这俩是配对的,为了类型的审查正确
 - vxe table columns 要用data里的值,用computed的值会导致排序部分不好用。
			
vxe table columns 要用data里的值,用computed的值会导致排序部分不好用.
 - springboot打印启动信息
			
打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程: 1.Spring容器在进行初始化时,会将xml或者annotation配置的bean的信息封装成一 ...
 - 性能优化:编译器优化选项 -O2/-O3 究竟有多强大?
			
之前的"性能优化的一般策略及方法"一文中介绍了多种性能优化的方法.根据以往的项目经验,开启编译器优化选项可能是立竿见影.成本最低.效果最好的方式了. 这么说可能还不够直观,举个真实 ...
 - 记录--vue打印插件
			
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网页实现打印 可以选择性的打印某一部分 的vue组件 1.引入 把print.js 下载到本地,然后放在src 下面添加文件夹里. pri ...