<optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

<code id="6y7f6"></code>

  • <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
    <code id="6y7f6"><form id="6y7f6"></form></code>

      重學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 只需要關注自己的業務實現和事件發送,其他的外部監控訂閱即可。

      此系列逐步更新,這個用的比較多,但是還有人沒用過所以寫下。

      posted @ 2023-05-31 20:07  敖毛毛  閱讀(51)  評論(0編輯  收藏  舉報
      欧洲黄色网页链接入口,免费A级毛片无码无遮挡久久影院,a免费黄色网址,国产一级黄色的网站
      <optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

      <code id="6y7f6"></code>

    1. <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
      <code id="6y7f6"><form id="6y7f6"></form></code>