Да, ваш код блокируется при использовании его в проекте Winforms. Проблема в том, что класс Ping делает все возможное, чтобы вызвать событие PingCompleted в том же потоке, который вызвал SendAsync (). Для этого он использует метод AsyncOperationManager.CreateOperation ().
Проблема в том, что на самом деле работает в приложении Winforms. Он пытается поднять событие в главном потоке. Но это не может работать, так как вы заблокировали основной поток с помощью вызова countdown.Wait (). Пинг не может быть завершен, так как основной поток заблокирован. Основной поток не может завершиться, так как проверка не завершена. Город тупик.
Он работает в приложении в режиме консоли, поскольку у него нет поставщика синхронизации, как в Winforms. Событие PingComplete будет инициировано в потоке потоков.
Блокировка потока пользовательского интерфейса в корне ошибочна. Быстрое решение заключается в запуске кода в рабочем потоке. Помните, что это делает событие ProbeCompleted сработавшим также и для этого работника. Используйте Control.BeginInvoke (), чтобы перенаправить его в поток пользовательского интерфейса. Или используйте BackgroundWorker.
private void Form1_Load(object sender, EventArgs e) {
PortScanner ps = new PortScanner();
ps.ProbeCompleted += new PingProbeCompleted(ps_ProbeCompleted);
ThreadPool.QueueUserWorkItem((w) => ps.run_ping_probe());
}
И не забудьте удалить дополнительный вызов Signal ().