Уведомления о сборке мусора

Наткнулся на статью про уведомления о сборке мусора: https://learn.microsoft.com/ru-ru/dotnet/standard/garbage-collection/notifications и решил опробовать на простеньком коде, как это работает.

Основные тезисы, которые я подчерпнул из статьи:

  • Для того, чтоб включить отправку уведомлений, нужно использовать метод GC.RegisterForFullGCNotification()
  • Мониторинг уведомлений о сборке мусора запускается вроде как в отдельном потоке (но это неточно)
  • В конце нужно выключить отправку уведомлений методом GC.CancelFullGCNotification();

Путем склеивания чего-то с чем-то я написал код ниже. В результате программа мне постоянно выдает результат Canceled, что означает согласно MSDN "Текущая регистрация отменена пользователем." Почему я не получаю уведомлений о приближении сборки мусора и о сборке мусора? Скорей всего я делаю что-то глупое, но не пойму что, объясните пожалуйста и покажите, как исправить код, чтоб уведомления проходили.

P.S Для любителей послать на Google, я там уже был, мне не помогло(((

using System.Diagnostics;
using System.Threading;
using System.Runtime;

namespace Test_ConsoleNet5
{
  internal class Program
  {
      static bool checkForNotify = false;
      static bool finalExit = false;
      class UserInfo
      {
          public string Name { set; get; }
          public int Age { set; get; }

          public UserInfo(string Name, int Age)
          {
              this.Name = Name;
              this.Age = Age;
          }
          ~UserInfo()
          {
              Console.WriteLine("Объект уничтожен");
          }
      }

      static void Main(string[] args)
      {
          GC.RegisterForFullGCNotification(20, 20);
          Console.WriteLine("Registered for GC notification.");

          checkForNotify = true;


          Thread thWaitForFullGC = new Thread(new ThreadStart(WaitForFullGCProc));
          thWaitForFullGC.Start();


          Console.WriteLine("The begining of the cycle");

          for (int i = 0; i < 100; i++)
          {
              UserInfo user = new UserInfo("Dm", 27);
          }

          Console.WriteLine("The END of the cycle");




          // Намеренно вызовем сборку мусора
          GC.Collect(0, GCCollectionMode.Forced);
          GC.WaitForPendingFinalizers();

          finalExit = true;
          checkForNotify = false;
          GC.CancelFullGCNotification();







      }
      public static void WaitForFullGCProc()
      {
          while (true)
          {
              
              while (checkForNotify)
              {
                  
                  GCNotificationStatus s = GC.WaitForFullGCApproach();
                  if (s == GCNotificationStatus.Succeeded)
                  {
                      Console.WriteLine("GC Notification raised.[A]");
                      
                  }
                  else if (s == GCNotificationStatus.Canceled)
                  {
                      Console.WriteLine("GC Notification cancelled.[A]");
                      break;
                  }
                  else
                  {
                      
                      Console.WriteLine("GC Notification not applicable[A].");
                      break;
                  }

                  
                  GCNotificationStatus status = GC.WaitForFullGCComplete();
                  if (status == GCNotificationStatus.Succeeded)
                  {
                      Console.WriteLine("GC Notification raised.[C]");
                     
                  }
                  else if (status == GCNotificationStatus.Canceled)
                  {
                      Console.WriteLine("GC Notification cancelled.[C]");
                      break;
                  }
                  else
                  {
                      
                      Console.WriteLine("GC Notification not applicable.[C]");
                      break;
                  }
              }

              Thread.Sleep(500);
              
              if (finalExit)
              {
                  break;
              }
          }
      }

  }
}

Ответы (0 шт):