如何在线程休眠时中止线程

Tir*_*mit 4 c#

我需要停止线程,但如果要睡8秒,我想放弃它,它会继续沉睡8秒,然后才停止.

spe*_*der 14

使用ManualResetEvent:

ManualResetEvent mre=new ManualResetEvent(false);
//......
var signalled=mre.WaitOne(TimeSpan.FromSeconds(8));
if(!signalled)
{
    //timeout occurred
}
Run Code Online (Sandbox Code Playgroud)

其他地方(在8秒之前):

mre.Set(); //unfreezes paused Thread and causes signalled==true
Run Code Online (Sandbox Code Playgroud)

并允许未阻塞的线程正常终止.Thread.Abort邪恶的,应该避免.


Ree*_*sey 7

在线程处于睡眠状态时,您无法(安全地)中止线程.您应该在阻止完成后立即检查中止情况,然后退出该点.

无论如何,在大多数情况下确实没有这个缺点,因为线程在阻塞时将使用非常少的资源.

如果你必须尽快"中止",你可以使用不同的阻止机制.睡眠很少是正确的选择 - 等待句柄可能会提供相同的功能,并为另一个线程提供一种方法,表明它应该立即停止阻塞.


Mar*_*ian 6

考虑使用该System.Timers.Timer课程.这是一个可以在需要时停止的计时器.

你可以在这里找到一些好的指示