0

所以这个让我很难过,而且看起来很奇怪。我编写了一些 c# 表单,它们充当客户端服务器应用程序设置中的“服务器”组件。(客户端发送 udp 数据,服务器程序 chug 一些数字并返回结果。)由于各种原因,一个表单的 4 个实例和另一个表单的 1 个实例同时运行。我有一个 bat 文件,可以在电源重置的情况下自动启动所有这些表格。

无论如何,所以我试图让它一直运行并让它们有点可靠。一个月前它工作得很好,但在过去的几周里,我注意到它们一直在消失。有时他们熬夜一天,有时是 4 天,然后就消失了。(直到最后一次出现,它们似乎都同时消失了,但我没有在看,所以我不能确定。最后一次,由于某种原因,一种不同的形式一直在运行。)

所以我添加了一些日志记录,发现所有表单确实在同一秒消失了,_FormClosing 事件显示了 TaskManagerClosing 的 CloseReason。

我知道事实上没有其他人可以物理访问这台机器。

什么可能导致这种情况发生?其他人开始认为我的电脑可能被感染了?只是一个想法,但无论如何这种行为对于恶意软件或病毒来说都是奇怪的。特别是因为计算机上的其他所有东西似乎都表现得很好。那就是说我确实安装了tightVNC,也许那不是那么安全。

除此之外没有太多其他东西,也许防病毒软件或 Ad-Aware 正在关闭表格?

想法?提前致谢。

4

1 回答 1

0

只是一些想法,因为这看起来很奇怪。

首先,MSDN 文档在声明 CloseReason.TaskManagerClosing 表示“Windows 任务管理器正在关闭应用程序”时具有误导性。相反,当窗口收到 WM_CLOSE 消息 (0x10) 时,CloseReason.TaskManagerClosing 被设置为关闭原因,该消息可能源自系统上的任何进程,不一定是任务管理器。

这就提出了一个问题:为什么在这些进程上调用 WM_CLOSE?一种可能性是侦听 UDP 数据包会触发安全软件(病毒/广告软件)上基于规则的过滤器,这可能会在进程关闭时出现在软件和 Windows 事件日志中。除此之外,如果不知道拥有过程,就很难诊断。

虽然它没有解决根本原因,但一种实用的选择是简单地取消 WM_CLOSE 请求以响应 FormClosing 事件。

        if (e.CloseReason == CloseReason.TaskManagerClosing)
            e.Cancel = true;

另一种选择是将软件重组为 Windows 服务而不是应用程序。服务往往更适合服务器类型的应用程序,因为它们在自己的用户会话中运行。但它也需要将用户界面功能与服务器功能分开,并且也不会解决根本问题。

最后,如果这是一个服务器,您可能想要重新访问任何可能无关的已安装服务或实用程序,并以某种方式将 WM_CLOSE 命令发送到应用程序实例。此外,将服务器应用程序实例移至干净的服务器可能是隔离问题的实用方法。

于 2011-07-30T07:28:54.513 回答