Наиболее типичная проблема с таким кодом - не сохранение ссылки на экземпляр делегата.Тот, который вы передаете в качестве первого аргумента SetConsoleCtrlHandler ().Сборщик мусора не может видеть ссылки, хранящиеся на объекте делегата неуправляемым кодом.Таким образом, это, в конечном счете, будет бомбить при запуске сборщика мусора:
SetConsoleCtrlHandler(Handler, true);
, что точно так же, как
SetConsoleCtrlHandler(new EventHandler(Handler), true);
, при условии, что вы использовали типы в связанном коде.Автор этого кода тщательно избежал этой проблемы, сделав _handler статической переменной.В отличие от временного экземпляра делегата, который создается двумя предыдущими строками кода.Хранение его в статической переменной гарантирует, что на него будут ссылаться в течение всей жизни программы.Правильное действие в данном конкретном случае, поскольку вы на самом деле интересуетесь событиями до завершения программы.