В настоящее время я работаю над некоторыми инструментами для приложения 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 я вижу оба?