所以这个让我难过,而且看起来很奇怪。 我写了一些c#表单,它们充当客户端服务器应用程序设置中的“服务器”组件。 (客户端发送udp数据,服务器程序突然显示一些数字并发回结果。) 由于各种原因,有4个实例同时运行1个表单和1个另一个表单实例。我有一个bat文件,可以在电源复位时自动启动所有这些表格。
无论如何,所以我试图让它一直运行并使它们有点可靠。 它在一个月前工作正常,但在过去的几周里,我注意到它们已经消失了。有时他们会熬夜一天,有时候会熬四天,但随后就会消失。 (直到最后一次出现,他们似乎都会在同一时间消失,但我不是在看,所以我无法确定。这是最后一次不同形式由于某种原因而继续运行。)
所以我添加了一些日志记录,发现所有表单都在同一秒内消失,而_FormClosing事件显示了TaskManagerClosing的CloseReason。
我知道其他人没有物理访问机器的事实。
可能导致这种情况发生的原因是什么? 还有其他人开始认为我的电脑可能被感染了?只是一个想法,但这种行为对恶意软件或病毒来说都是奇怪的。特别是因为计算机上的其他所有东西看起来都很好。那说我确实安装了tightVNC,也许那不安全。
除此之外没有其他的东西,也许防病毒软件或Ad-Aware正在关闭表格?
思考? 在此先感谢。
答案 0 :(得分:0)
只是一些想法,因为这看起来很奇怪。
首先,当MSDN documentation表明CloseReason.TaskManagerClosing指示“Windows任务管理器正在关闭应用程序”时,{{3}}会产生误导。更确切地说,当窗口收到WM_CLOSE消息(0x10)时,CloseReason.TaskManagerClosing被设置为关闭原因,该消息可能来自系统上的任何进程,而不一定是任务管理器。
这提出了一个问题:为什么要在这些进程上调用WM_CLOSE?一种可能性是,监听UDP数据包会触发安全软件(病毒/广告软件)上基于规则的过滤器,这些过滤器可能会在流程关闭时显示在软件和Windows事件日志中。除此之外,如果不了解拥有过程,就很难诊断出来。
虽然它没有解决根本原因,但一个实际的选择就是取消WM_CLOSE请求以响应FormClosing事件。
if (e.CloseReason == CloseReason.TaskManagerClosing)
e.Cancel = true;
另一种选择是将软件重组为Windows服务而不是应用程序。服务往往更适合服务器类型的应用程序,因为它们在自己的用户会话中运行。但它还需要将用户界面功能与服务器功能分开,并且也不会解决潜在的问题。
最后,如果这是一台服务器,您可能需要重新访问任何可能无关的安装服务或实用程序,并以某种方式将WM_CLOSE命令发送到应用程序实例。此外,将服务器应用程序实例移动到干净的服务器可能是隔离问题的实用方法。