2011-03-22 56 views
3

我正在测试一些错误处理代码,并试图确保我的应用程序和数据总是失败到一致的状态。我已经验证了代码以“正常”注入错误的方式工作,但我想更进一步。停止.NET线程的最不优雅的方式是什么?

什么是最简单的杀死.NET线程的方式,让错误处理尽可能少地做到这一点?

想一想,例如,如何测试CLR约束执行区域的限制?或者,我会如何模拟像拔出插头一样严重的事情?

+10

将它从轨道上剔除。 – Jimmy 2011-03-22 16:12:19

+12

拔下电脑。 – 2011-03-22 16:12:52

+1

@John Rasch就像抛出异常一样实用,我必须承认,少数场景与直接电源故障一样戏剧性。 – CodexArcanum 2011-03-22 16:16:26

回答

3

您可以调用/调用TerminateThread windows API函数。但是,这很可能会破坏程序中的非托管状态,包括CLR本身的状态。所以在这样做之后,你的过程处于一个未定义的状态,这可能是杀死整个过程的好主意。

+0

伟大的想法,严重错误的完美例子。 – JasonRShaver 2011-03-22 16:31:08

1

你可以使用Thread.Abort。这将强制在该线程上抛出ThreadAbortedException。

最有力的方式,缺乏切割能力当然是要杀死任务管理器的过程。

2

如果你有一个线程的句柄,你可以调用Thread.Abort(); 这会在被调用的线程上抛出一个ThreadAbortedException。

+0

我已经得到了那么多,但如果系统内存不足,它不能实例化ThreadAbortedException?我将如何模拟这个级别的东西? – JasonRShaver 2011-03-22 16:15:42

+0

这将执行'finally'子句,所以它不是真的突然。甚至可能根本不会终止线程。 – CodesInChaos 2011-03-22 16:17:21

+0

如果你内存不足,你很快就会崩溃..:)在此之后你就无能为力了 – 2011-03-22 16:17:38

6

导致堆栈溢出异常 - 无法捕捉。只需编写一个自称的函数。

+0

我喜欢它,那是非常严肃的。任何想法如何将其注入到另一个线程? – JasonRShaver 2011-03-22 16:22:03

+0

你的意思是,*注入*?线程从调用委托开始,代码从那里继续。你需要编写线程,以便在某个时刻调用无限递归。 – 2011-03-22 16:28:09

0

Thread.Abort被认为是邪恶的。其中一种可能的方法是获得工人和调用者都可见的volatile布尔值(来源:http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation

+1

我想他想要一些邪恶的东西来测试他的程序如何处理它。 – CodesInChaos 2011-03-22 16:20:10

+0

我还将添加Thread.Abort可以导致C#中的内存链接的提示,这正是我感兴趣的测试内容。 – JasonRShaver 2011-03-22 16:23:36

1

唯一不会终止整个过程可以防止捕获并最终阻止执行的方法是通过禁止TerminateThread()。这是一个有问题的功能,只能在测试场景中使用。它泄漏为堆栈分配的内存。你也很难得到你需要的线程句柄。这需要pinvoking GetCurrentThread(),必须从线程本身内部完成。

在此之后,测试程序的状态是随机的,很像使用Thread.Abort()时的情况。好吧,更糟。

相关问题