Hos*_*146 13 c# multithreading
我有一个工作单元,我在一个线程(不是主线程).在某些情况下,我想让这个线程睡10秒钟.Thread.Sleep(10000)是最有效的方法吗?
Hen*_*man 21
Thread.Sleep(10000)是最有效的方法吗?
是的,因为它没有忙等待而是放弃了CPU.
但它浪费了一个线程.你不应该将它扩展到许多睡眠线程.
Jon*_*eet 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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们只shouldStop在锁内访问,因此没有任何内存模型问题.
你可能想要循环等待,直到你真的睡了10秒钟,以防万一你得到虚假的叫醒 - 这取决于你不再做10秒的工作是多么重要.(我从来没有故意听到过虚假的醒来,但我相信它们是可能的.)
养成使用Thread.CurrentThread.Join(timeout)而不是Thread.Sleep 的习惯.
不同之处在于Join仍然会进行一些消息传递(例如GUI和COM).
大多数情况下它并不重要,但如果您需要在应用程序中使用某些COM或GUI对象,它会让生活更轻松.
| 归档时间: |
|
| 查看次数: |
58552 次 |
| 最近记录: |