Уведомления о сборке мусора
Наткнулся на статью про уведомления о сборке мусора: 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;
}
}
}
}
}