使当前线程进入睡眠状态

本文关键字:状态 前线 线程 | 更新日期: 2023-09-27 18:10:21

我有一个单位的工作,我正在做一个线程(不是主线程)。在某些情况下,我想让这个线程休眠10秒。Thread.Sleep(10000)是最有效的方法吗?

使当前线程进入睡眠状态

Thread.Sleep(10000)是最有效的方法吗?

是的,从某种意义上说,它不是在忙等待,而是在放弃CPU。

但是这是浪费线程。您不应该将此扩展到许多睡眠线程。

因为没有人提到过……

如果你想让另一个线程能够唤醒你的"睡眠"线程,你可能很想使用Monitor.Wait而不是Thread.Sleep:

private readonly object sharedMonitor;
private bool shouldStop;
public void Stop()
{
    lock (sharedMonitor)
    {
        shouldStop = true;
        Monitor.Pulse(sharedMonitor);
    }
}
public void Loop()
{
    while (true)
    {
        // Do some work...
        lock (sharedMonitor)
        {
            if (shouldStop)
            {
                return;
            }
            Monitor.Wait(sharedMonitor, 10000);
            if (shouldStop)
            {
                return;
            }
        }
    }
}

注意,我们只访问锁内的shouldStop,所以没有任何内存模型问题。

可能想要循环等待,直到你真的睡了10秒,以防万一你得到虚假的唤醒-这取决于你再做另一个10秒的工作有多重要。(我从来没有故意遇到过虚假的醒来,但我相信这是可能的。)

养成使用Thread.CurrentThread.Join(timeout)而不是Thread.Sleep的习惯。

区别在于Join仍然会做一些消息泵送(例如GUI &COM) .

大多数情况下,这并不重要,但如果你需要在应用程序中使用一些COM或GUI对象,它会使生活变得更容易。

这将在不使用线程的情况下每x秒处理一次不确定不使用自己的线程与每两秒钟创建一次的任务运行相比如何

public void LogProcessor()
    {
       if (_isRunning)
        {
            WriteNewLogsToDisk();              
            // Come back in 2 seonds
            var t = Task.Run(async delegate
            {
                await Task.Delay(2000);
                LogProcessor();
            });               
        }
    }

从资源效率来看,是的。

对于设计,它取决于暂停的情况。您希望您的工作是自治的,所以如果线程必须暂停,因为它知道要等待,那么使用静态线程将暂停放在线程代码中。睡眠的方法。如果暂停发生是因为其他外部事件,而不是您需要控制线程处理,那么让线程所有者保持对线程的引用并调用childThread.Sleep.

是。没有其他有效或安全的方法让线程休眠。

然而,如果你在循环中做一些工作,你可能想要使用Sleep in loop来使终止线程更容易,以防你想要取消你的工作。

下面是一个例子:

bool exit = false;
...
void MyThread()
{
    while(!exit)
    {
        // do your stuff here...
        stuff...
        // sleep for 10 seconds
        int sc = 0;
        while(sc < 1000 && !exit) { Thread.Sleep(10); sc++; }
    }
}