我有一个工作单元,我在一个线程(不是主线程)。在某些情况下,我想让这个线程睡10秒钟。 Thread.Sleep(10000)是执行此操作的最有效资源的方法吗?
答案 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();
});
}
}