我正在测试一些错误处理代码,并且我正在尝试确保我的应用程序和数据始终处于一致状态。我已经验证了代码与“正常”注入错误的方式一起工作,但我想更进一步。
杀死.NET线程最突然的方法是什么,让错误处理的机会最少?
例如,您如何测试CLR约束执行区域的限制?或者我如何模拟像拔插头一样严肃的东西?
答案 0 :(得分:6)
导致Stack Overflow异常 - 无法捕获。只需编写一个自称的函数。
答案 1 :(得分:3)
您可以p /调用TerminateThread
Windows API函数。但是这很有可能破坏程序中的非托管状态,包括CLR本身的状态。因此,在执行此操作后,您的流程处于未定义状态,并且杀死整个流程可能是一个好主意。
答案 2 :(得分:2)
如果你有一个线程的句柄,你可以调用Thread.Abort(); 这会在被调用的线程上抛出一个ThreadAbortedException。
答案 3 :(得分:1)
您可以使用Thread.Abort。这将强制在线程上抛出ThreadAbortedException。
最有力的方式,缺乏切割能力当然是要从任务经理那里扼杀过程。
答案 4 :(得分:1)
执行此操作的唯一方法是不终止整个进程和,以防止catch和finally块执行是通过pinvoking TerminateThread()。这是一个有问题的功能,仅在测试场景中可用。它泄漏了为堆栈分配的内存。你也很难获得你需要的线程处理。这需要调整GetCurrentThread(),这必须从线程本身内部完成。
此后测试程序的状态是随机的,就像使用Thread.Abort()时一样。好吧,更糟。
答案 5 :(得分:0)
Thread.Abort被认为是邪恶的。其中一种可能的方法是使用一个对工作者和调用者都可见的volatile布尔值(来源:http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation)