.net формы продолжают исчезать из-за TaskManagerClosing - PullRequest
0 голосов
/ 30 июля 2011

Так что это меня озадачило, и кажется странным.Я написал несколько форм c #, которые выступают в качестве «серверного» компонента в настройке приложения клиент-сервер.(Клиент отправляет данные udp, серверная программа загружает некоторые числа и отправляет обратно результаты.) По разным причинам одновременно выполняется 4 экземпляра 1 формы и 1 экземпляр другой формы.И у меня есть файл bat, который автоматически запускает все эти формы в случае сброса питания.

В любом случае, поэтому я стараюсь все время работать, чтобы они были несколько надежными.Месяц назад все работало нормально, но за последние несколько недель я заметил, что они исчезают.Иногда они не спят в течение дня, иногда 4, но затем просто исчезают.(Вплоть до последнего происшествия все они, казалось бы, исчезали в одно и то же время, но я не смотрел, поэтому не мог быть уверен. В этот последний раз одна другая форма почему-то продолжала работать.)

Поэтому я добавил некоторые записи и обнаружил, что все формы исчезают в одну и ту же секунду, а событие _FormClosing показывает CloseReason of TaskManagerClosing.

Я точно знаю, что никакой другой человек не имеет физического доступа к машине.

Что может вызвать это?Кто-нибудь еще начинает думать, что мой компьютер заражен?Просто мысль, но это поведение было бы странным для вредоносных программ или вирусов в любом случае.Тем более, что все остальное на компьютере, кажется, ведет себя просто отлично.Тем не менее, у меня действительно есть туго установленный VNC, может быть, это не так уж и безопасно.

Кроме того, не так много другого, может быть, антивирусное программное обеспечение или Ad-Aware закрывает формы ??

Мысли?Заранее спасибо.

1 Ответ

0 голосов
/ 30 июля 2011

Просто некоторые мысли, поскольку это кажется очень странным.

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

...