C# - 为什么Thread.Suspend()如此糟糕?

时间:2015-05-07 17:26:21

标签: c# multithreading thread-safety

标题说明了一切。我正在运行Selenium Web测试脚本,我希望能够在用户按钮单击时暂停。 Thread.Suspend()工作得很好,但我一直在看到你不应该如何使用它,但没有人真正详细说明为什么你不应该使用它。

是否存在真的不是那么糟糕的情况,但这只是你可能不应该养成使用习惯的事情之一?

如果我使用thread.suspend暂时停止一个简单的脚本,世界是否会认真结束?

在我的情况下,我希望线程在用户按钮单击时立即停止。使用标志避免thread.suspend()的所有其他解决方案,以及在这种情况下我不希望它们完全不起作用。

所以有人可以向我解释为什么thread.suspend()是一个如此糟糕的主意,如果我所做的只是运行一个简单的脚本?

1 个答案:

答案 0 :(得分:2)

来自http://www.albahari.com/threading/part4.aspx#_Suspend_and_Resume

  

从.NET 2.0开始,Suspend和Resume已被弃用,由于任意暂停另一个线程所固有的危险,因此不鼓励使用它们。如果暂停对关键资源进行锁定的线程,则整个应用程序(或计算机)可能会死锁。这比调用Abort要危险得多 - 这会导致任何这样的锁通过finally块中的代码被释放(至少在理论上)。

     

然而,在当前线程上调用Suspend是安全的 - 这样做可以实现一个简单的同步机制 - 循环中的工作线程,执行任务,调用Suspend on,然后等待当另一个任务准备就绪时,主线程恢复(“唤醒”)。然而,困难在于确定工人是否被停职。

我补充说,只有当你知道自己没有锁时,最后一部分才是真的。这可能非常复杂(如果你从方法B和方法A中调用的方法C中挂起,你能确定方法B和方法A都没有锁定任何东西吗?)。但是,即使您希望同时拥有多个锁,这个问题通常也存在:除非您非常好非常有条理,否则始终可以创建死锁。