C# - 为什么 Thread.Suspend() 如此糟糕?
C# - why is Thread.Suspend() so bad?
标题说明了一切。我是 运行 一个 Selenium 网络测试脚本,我希望能够在用户单击按钮时暂停。 Thread.Suspend() 工作得很好,但我到处都看到你不应该如何使用它,但没有人真正深入到为什么你不应该使用它的细节。
是否存在它确实没有那么糟糕的情况,但它只是您可能不应该养成使用习惯的其中一种情况?
或者如果我使用 thread.suspend 暂时停止一个简单的脚本,世界真的会结束吗?
在我的例子中,我希望线程在用户单击按钮时立即停止。在这种情况下,避免 thread.suspend() 使用标志和诸如此类的东西的所有其他解决方案都不能像我希望的那样工作。
如果我所做的只是 运行 一个简单的脚本,那么有人可以向我解释为什么 thread.suspend() 是个坏主意吗?
来自http://www.albahari.com/threading/part4.aspx#_Suspend_and_Resume
From .NET 2.0, Suspend and Resume have been deprecated, their use discouraged because of the danger inherent in arbitrarily suspending another thread. If a thread holding a lock on a critical resource is suspended, the whole application (or computer) can deadlock. This is far more dangerous than calling Abort — which results in any such locks being released (at least theoretically) by virtue of code in finally blocks.
It is, however, safe to call Suspend on the current thread — and in doing so you can implement a simple synchronization mechanism — ith a worker thread in a loop, performing a task, calling Suspend on itself, then waiting to be resumed (“woken up”) by the main thread when another task is ready. The difficulty, though, is in determining whether the worker is suspended.
我要补充一点,只有当您知道自己没有锁时,最后一部分才是正确的。这可能非常复杂(如果您在从方法 B 和方法 A 调用的方法 C 中挂起,您能确定方法 B 和方法 A 都没有锁定任何东西吗?)。但是一般来说,即使你想同时拥有多个锁,这个问题也存在:除非你非常优秀并且非常有条不紊,否则创建死锁总是有可能的。
标题说明了一切。我是 运行 一个 Selenium 网络测试脚本,我希望能够在用户单击按钮时暂停。 Thread.Suspend() 工作得很好,但我到处都看到你不应该如何使用它,但没有人真正深入到为什么你不应该使用它的细节。
是否存在它确实没有那么糟糕的情况,但它只是您可能不应该养成使用习惯的其中一种情况?
或者如果我使用 thread.suspend 暂时停止一个简单的脚本,世界真的会结束吗?
在我的例子中,我希望线程在用户单击按钮时立即停止。在这种情况下,避免 thread.suspend() 使用标志和诸如此类的东西的所有其他解决方案都不能像我希望的那样工作。
如果我所做的只是 运行 一个简单的脚本,那么有人可以向我解释为什么 thread.suspend() 是个坏主意吗?
来自http://www.albahari.com/threading/part4.aspx#_Suspend_and_Resume
From .NET 2.0, Suspend and Resume have been deprecated, their use discouraged because of the danger inherent in arbitrarily suspending another thread. If a thread holding a lock on a critical resource is suspended, the whole application (or computer) can deadlock. This is far more dangerous than calling Abort — which results in any such locks being released (at least theoretically) by virtue of code in finally blocks.
It is, however, safe to call Suspend on the current thread — and in doing so you can implement a simple synchronization mechanism — ith a worker thread in a loop, performing a task, calling Suspend on itself, then waiting to be resumed (“woken up”) by the main thread when another task is ready. The difficulty, though, is in determining whether the worker is suspended.
我要补充一点,只有当您知道自己没有锁时,最后一部分才是正确的。这可能非常复杂(如果您在从方法 B 和方法 A 调用的方法 C 中挂起,您能确定方法 B 和方法 A 都没有锁定任何东西吗?)。但是一般来说,即使你想同时拥有多个锁,这个问题也存在:除非你非常优秀并且非常有条不紊,否则创建死锁总是有可能的。