.net формы продолжают исчезать из-за TaskManagerClosing
Так что это меня озадачило, и кажется странным. Я написал несколько форм C#, которые выступают в качестве компонента "сервер" в настройке приложения клиент-сервер. (Клиент отправляет данные udp, серверная программа загружает некоторые цифры и отправляет обратно результаты.) По разным причинам одновременно выполняется 4 экземпляра 1 формы и 1 экземпляр другой формы. И у меня есть файл bat, который автоматически запускает все эти формы в случае сброса питания.
В любом случае, поэтому я стараюсь все время работать, чтобы они были достаточно надежными. Месяц назад все работало нормально, но за последние несколько недель я заметил, что они исчезают. Иногда они не спят в течение дня, иногда 4, но затем просто исчезают. (Вплоть до последнего происшествия все они, казалось бы, исчезали в одно и то же время, но я не смотрел, поэтому не мог быть уверен. В этот раз одна другая форма по какой-то причине продолжала работать.)
Поэтому я добавил некоторые записи и обнаружил, что все формы исчезают в одну секунду, а событие _FormClosing показывает CloseReason of TaskManagerClosing.
Я точно знаю, что никто другой не имеет физического доступа к машине.
Что может стать причиной этого? Кто-нибудь еще начинает думать, что мой компьютер заражен? Просто мысль, но это поведение было бы странным для вредоносных программ или вирусов в любом случае. Тем более, что все остальное на компьютере, кажется, ведет себя просто отлично. Тем не менее, я установил туго VNC, может быть, это не так безопасно.
Кроме этого нет ничего другого, может быть, антивирусное программное обеспечение или Ad-Aware закрывает формы?
Мысли? Заранее спасибо.
1 ответ
Просто некоторые мысли, так как это кажется очень странным.
Во-первых, документация MSDN вводит в заблуждение, когда говорится, что CloseReason.TaskManagerClosing указывает, что "Диспетчер задач Windows закрывает приложение". Похоже, что CloseReason.TaskManagerClosing устанавливается в качестве причины закрытия, когда окно получает сообщение WM_CLOSE (0x10), которое может происходить из любого процесса в системе, а не обязательно из диспетчера задач.
Возникает вопрос: почему WM_CLOSE вызывается для этих процессов? Одна из возможностей заключается в том, что прослушивание пакетов UDP запускает фильтр на основе правил в программном обеспечении безопасности (вирус / рекламное ПО), который может отображаться в программном обеспечении и журналах событий Windows во время закрытия процессов. Помимо этого, трудно диагностировать, не зная процесса владения.
Хотя это и не устраняет основную причину, один из практических вариантов - просто отменить запрос WM_CLOSE в ответ на событие FormClosing.
if (e.CloseReason == CloseReason.TaskManagerClosing)
e.Cancel = true;
Другой вариант - реструктурировать программное обеспечение как службу Windows, а не как приложение. Службы, как правило, лучше подходят для приложений серверного типа, поскольку они работают в своем собственном пользовательском сеансе. Но это также потребует отделения функциональности пользовательского интерфейса от функциональности сервера, а также не решит основную проблему.
Наконец, если это сервер, вы можете захотеть пересмотреть все установленные службы или утилиты, которые могут быть посторонними, и каким-то образом отправить команду WM_CLOSE экземплярам приложения. Кроме того, перемещение экземпляров серверных приложений на чистый сервер может быть практическим подходом к изоляции проблемы.