Почему мне не хватает «GCStart_V2» в EventListener для ASP.NET Core 2.2? - PullRequest
0 голосов
/ 08 февраля 2019

В настоящее время я работаю над некоторыми инструментами для приложения ASP.NET Core 2.2 и создал EventListener , чтобы дать мне информацию о сборке мусора.

Помимо прочего, меня интересует, когда сборка мусора начинается и когда она останавливается.

Следуя примерам, данным Кристофером Нараре (Christophe Nararre) в обработчиках событий CLR In-process, я создал следующий EventListener .

    public class GcEventListener : EventListener
    {
        private const int GCKeyword = 0x1;

        private const int GCStart = 1;
        private const int GCEnd = 2;

        protected override void OnEventSourceCreated(EventSource eventSource)
        {
            if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime"))
            {
                EnableEvents(eventSource, EventLevel.Verbose, (EventKeywords)GCKeyword);
            }
        }

        protected override void OnEventWritten(EventWrittenEventArgs eventData)
        {
            if (eventData.EventId == GCStart)
            {
                Console.WriteLine($"{DateTime.Now} - Garbage Collection Started...");
            }

            if (eventData.EventId == GCEnd)
            {
                Console.WriteLine($"{DateTime.Now} - Garbage Collection Stopped...");
            }
        }
    }

Чтобы проверить, что вышеупомянутый EventListener делает то, что я намереваюсь сделать, я создал следующее консольное приложение (.NET Core 2.2), которое генерирует кучу мусора в узком цикле:

class Program
{
    static void Main(string[] args)
    {
        GcEventListener listener = new GcEventListener();

        string trash;

        do
        {
            trash = new string('*', 10_000);
            trash = null;
        } while (!Console.KeyAvailable);
    }
}

При выполнении вышеуказанной программы я вижу, что «EventId» 1 и 2 (GCStart_V2 и GCEnd_V1 соответственно) поднимаются и обрабатываются, как и ожидалось.

Однако, когда я привожу точно такое же EventListener в приложении ASP.NET Core 2.2 Я вижу событие "GCEnd_V1", но не событие "GCStart_V2".

Мой вопрос: почему, в контексте ASP.NET Core 2.2 я вижу сборку мусора end но не start ;в то время как в контексте консольного приложения .NET Core 2.2 я вижу оба?

...