.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 экземплярам приложения. Кроме того, перемещение экземпляров серверных приложений на чистый сервер может быть практическим подходом к изоляции проблемы.

Другие вопросы по тегам