我编写了一项关键工作的Windows服务。 我的程序有5个执行关键任务的线程,我不希望它们被终止。
我使用进程黑客,在线程选项卡中我可以终止任何5个线程而不会导致整个程序被终止(因为程序只是容器) 当用户或黑客(我的程序是一个安全程序而用户可能想让它不起作用)终止一个线程时(如果它们被暂停但是没有策略阻止或修复终止,我恢复线程)并没有完成关键工作线程)
如何保护这5个线程不被终止? (我已经让程序本身很关键,但是当线程可以轻松终止时它没有任何价值)
答案 0 :(得分:-2)
我找到了解决问题的方法。
首先让我解释我是如何实现这一目标的:
我做了 2个看门狗线程,第一个重新创建 5个线程和WatchDogThread2终止时,第二个对看门狗1 (这让我很长,因为Thread.IsAlive
总是返回true,即使终止线程最终使用Thread.Join()
并且加入正在工作)。
当其中一个监视程序线程在终止后运行时,重新创建丢失的一个。但是在10-30秒后,异常被抛入与监督者无关的部分。
我多次重试并做了一些调试。 在30-50次尝试和编辑之后,我看到异常在特定部分的随机部分中抛出。
所以我开始研究例外
ExecutionEngineException
我发现当代码中的某些内容出错时,CRL会抛出此内容。
首先,我认为这个问题是由一个看门狗推动的,所以我改了几次但错误仍然存在(只是时间到了它被抛出一点点)
所以我完全删除了并启动了程序并终止了5个帖子
这次没有发生了。
我通过一些编辑多次执行此操作,并且看到此异常发生时不使用看门狗。 在看门狗之后2-3分钟而不是10-30秒之后发生异常。
我再次研究,微软在MSDN上写道,如果垃圾收集完成,有时会发生这种情况。我禁用垃圾整理并收到不再例外。
我写了另一个线程,迫使Garbage整理每一个 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分钟后触发垃圾收集,此时他将执行您想要的任何操作。)< / em>的