什么是停止.NET线程最不优雅的方法?

时间:2011-03-22 16:10:54

标签: c# .net error-handling

我正在测试一些错误处理代码,并且我正在尝试确保我的应用程序和数据始终处于一致状态。我已经验证了代码与“正常”注入错误的方式一起工作,但我想更进一步。

杀死.NET线程最突然的方法是什么,让错误处理的机会最少?

例如,您如何测试CLR约束执行区域的限制?或者我如何模拟像拔插头一样严肃的东西?

6 个答案:

答案 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