重學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 只需要關注自己的業務實現和事件發送,其他的外部監控訂閱即可。
結
此系列逐步更新,這個用的比較多,但是還有人沒用過所以寫下。