前言

简单介绍一下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 [三十五]的更多相关文章

  1. 重学c#系列——元组 [三十一]

    前言 元组并不是c# 7.0的东西,早之前就有,叫做tuple.7.0加了valuetuple. 来看下元组吧,主要一些注意的地方. 正文 为什么在7.0 之前,元组用的不多呢? 因为tuple 在代 ...

  2. 【Android Studio安装部署系列】三十五、从Android studio3.0.1升级到Android studio3.1.4【以及创建android p模拟器的尝试(未成功)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 因为想要使用Android P模拟器,所以需要将Android Studio升级到3.1版本以上. Android P模拟器的最低版 ...

  3. 重学c#系列——非托管实例(五)

    前言 托管资源到是好,有垃圾回收资源可以帮忙,即使需要我们的一些小小的调试来优化,也是让人感到欣慰的.但是非托管资源就显得苍白无力了,需要程序员自己去设计回收,同样有设计的地方也就能体现出程序员的设计 ...

  4. 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...

  5. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  6. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  8. .net基础学java系列(三)徘徊反思

    .net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...

  9. FreeSql (三十五)CodeFirst 自定义特性

    比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...

  10. 剑指Offer(三十五):数组中的逆序对

    剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

随机推荐

  1. gitlab推送代码触发jenkins构建

    预期:推送devloop或者master分支的代码, 自动执行jenkins 发布测试环境 首先,jenkins中需要安装如下插件 打开一个任务配置,构建触发器中勾选"Build when ...

  2. Scala学习历险记(第一天)

    Scala学习笔记(一) 前言:由于最近要整大数据相关的东西,所以java开发的我很苦逼的来学习Scala了,为接下来的工作做知识储备,今天是2021年8月19号,是我接触scala语言的第一天,因此 ...

  3. centos 定时任务

    想法 看见一个别的项目,每天扒bing的背景,然后 生成个列表,然后数据就一天天的增加,创意非常好 有时间研究下 关键字 centos 定时任务 基于centos7系统定时任务创建 https://b ...

  4. Vue3 好文收藏

    实用!最新的几个 Vue 3 重要特性提案 http://www.zyiz.net/tech/detail-142574.html

  5. AWS ES ISM学习应用笔记

    Elastic Search 6以上版本推出 ILM,用于管理Index的生命周期,但AWS上的ES是基于OSS版本的ES,所以自己开发了ISM来代替ILM.项目是从logstash往ES写入数据,但 ...

  6. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...

  7. 对象池Pools优化

    目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...

  8. 说说Vue 3.0中Treeshaking特性?举例说明一下?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code eliminat ...

  9. 记录--JavaScript 令人惊讶的一点:对于空数组every()方法返回true

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 JavaScript 语言的内核足够大,导致我们很容易误解它的某些部分是如何工作的.我最近重构了一些使用 every ()方法的代码,并且 ...

  10. 记录--uni-app在不同平台下拨打电话

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 场景 在App中拨打电话是一个比较常见的应用场景,但是我们通过搜索文章,发现,大部分的博文都是uni-app官网的copy, copy u ...