将当前线程置于休眠状态

时间:2011-10-04 16:23:05

标签: c# multithreading

我有一个工作单元,我在一个线程(不是主线程)。在某些情况下,我想让这个线程睡10秒钟。 Thread.Sleep(10000)是执行此操作的最有效资源的方法吗?

6 个答案:

答案 0 :(得分:21)

  

Thread.Sleep(10000)是执行此操作的最有效资源的方法吗?

是的,因为它不忙等待而是放弃CPU。

但它浪费了一个线程。你不应该将它缩放到许多睡眠线程。

答案 1 :(得分:13)

没有人提到它......

如果您希望其他线程能够唤醒您的“休眠”线程,您可能希望使用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秒的工作。 (我从来没有故意听到虚假的醒来,但我相信它们是可能的。)

答案 2 :(得分:6)

习惯使用Thread.CurrentThread.Join(timeout)代替Thread.Sleep。

不同之处在于Join仍然会进行一些消息传递(例如GUI和COM)。

大多数情况下,无关紧要,但如果您需要在应用程序中使用某些COM或GUI对象,它会让生活更轻松。

答案 3 :(得分:0)

从资源效率来看,是的。

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

答案 4 :(得分:0)

是。没有其他有效或安全的方式来睡觉。

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

以下是一个例子:

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++; }
    }
}

答案 5 :(得分:0)

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

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