最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

重学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>{    public void OnCompleted()    {    }    public void OnError(Exception error)    {        Console.WriteLine($"Error: {error.Message}");    }    public void OnNext(KeyValuePair 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{    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>{    public void OnCompleted()    {    }    public void OnError(Exception error)    {        Console.WriteLine($"Error: {error.Message}");    }    public void OnNext(KeyValuePair value)    {        Console.WriteLine($"EventName: {value.Key} - Payload: {value.Value}");    }}

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

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

关键词: