[英]Thread.Sleep SpinWait.SpinUntil weird behavior
我有下面的代码。
namespace SandBox
{
static class Program
{
static ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
static void Main()
{
Timer timer = new Timer(worker, null, 0, 3000);
while (true)
{
SpinWait.SpinUntil(IsEmpty); //???? freezes up here
string snippet;
while (!queue.TryDequeue(out snippet))
Thread.Sleep(1);
Console.WriteLine(snippet);
Thread.Sleep(5000); //??????
}
}
static void worker(object x)
{
queue.Enqueue("***___***___***");
}
static bool IsEmpty()
{
return queue.IsEmpty;
}
}
}
如果我不包括Thread.Sleep(5000);
它按预期工作。 但是,如果我这样做,它只输出一行,然后在 SpinUntil 部分冻结,不会再输出任何行。 如果我停止它并检查 queue.IsEmpty 是否为真,调试器会说它实际上是假的! (工人确实被定期调用,我检查了一个断点。)此外,IsEmpty 也被调用并返回 false。
怎么了?
SpinWait.SpinUntil
旋转直到满足指定条件。 在你的情况下,条件是IsEmpty
,所以它会旋转直到队列为空(或者,如果你愿意,当队列不为空时)。
由于等待您给了线程时间将某些东西放入队列中,因此微调器将继续旋转,因为它在应该清空队列的线程中,但它不能,因为它正在等待微调器。
如果更容易理解, SpinUntil(IsEmpty)
与SpinWhile(IsNotEmpty)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.