如何保护(我的进程)线程不被终止



我写了一个Windows服务,它完成了一个关键的工作。 我的程序有 5 个线程,它们执行关键工作,我不希望它们被终止。

我使用进程黑客,在线程选项卡中,我可以终止 5 个线程中的任何一个而不会导致整个程序被终止(因为程序只是容器) 当用户或黑客(我的程序是一个安全程序,用户可能希望使其不起作用)终止一个线程(如果他们被挂起但没有策略阻止或修复线程终止,我会恢复线程)时,关键工作没有完成)

如何保护这 5 个线程不被终止?
(我已经使程序本身变得至关重要,但是当线程可以轻松终止时,它确实没有价值)

我找到了解决问题的方法。

首先让我解释一下我是如何实现这一点的:

我制作了2 个看门狗线程,第一个线程在终止时重新创建5 个线程和 WatchDogThread2,第二个对看门狗 1执行相同的操作(这花了我很长时间,因为即使线程终止Thread.IsAlive也总是返回 true,最终使用Thread.Join()并且连接正在工作)。

当其中一个监视程序线程在终止后运行时,它将重新创建丢失的监视器线程。但是在 10-30 秒后,在与看门狗无关的部分抛出了异常

我多次重试并进行了一些调试。
经过 30-50 次尝试和编辑后,我看到此异常是在代码的随机部分中抛出的,而不仅仅是特定部分

所以我开始研究异常

ExecutionEngineException

我发现 CRL 在代码中出现问题时会抛出它。首先,我认为这个问题是由其中一个看门狗共同解决的,所以我更改了它们几次,但错误仍然存在(只是抛出它之前的时间稍微改变了一点)。
所以我完全删除了它们并启动了程序并终止了一个 5 线程。
这次什么也没发生

我又做了几次,并进行了一些编辑,并在不使用看门狗时看到此异常。异常出现在 2-3 分钟后,而不是看门狗的 10-30 秒

我再次研究,Microsoft MSDN上写道,如果完成垃圾回收,有时会发生这种情况。我禁用了垃圾排序规则,不再收到异常。

我写了另一个线程,迫使垃圾每0.5 秒整理一次,并在线程终止后看到程序收到ExecutionEngineException并崩溃。

这是垃圾整理的解决方案,因此整个过程崩溃并重新启动/BSOD发生。

<小时 />

最终解决方案

如果线程终止并且垃圾回收触发,则 CRL 将抛出ExecutionEngineException
只需每0.5秒进行一次手动垃圾整理,程序就会崩溃并重新启动。

法典:

Thread t1 = new Thread(delegate () {  
while (true) { 
System.GC.Collect(); 
Thread.Sleep(500); 
} 
}); 
t1.Start();

您可以启动其中两个线程以提高安全性(如果用户终止t1,垃圾收集将在 0-10 分钟后触发,此时他会做任何您想做的事情)。

最新更新