当有人说在实现您的线程解决方案时不允许轮询是什么意思,因为它很浪费,它有延迟并且是不确定的。线程不应使用轮询来相互发送信号。
编辑
根据您目前的回答,我相信我下面的线程实现(取自:http://www.albahari.com/threading/part2.aspx#_AutoResetEvent)没有使用轮询。如果我错了,请纠正我。
using System;
using System.Threading;
using System.Collections.Generic;
class ProducerConsumerQueue : IDisposable {
EventWaitHandle _wh = new AutoResetEvent (false);
Thread _worker;
readonly object _locker = new object();
Queue<string> _tasks = new Queue<string>();
public ProducerConsumerQueue() (
_worker = new Thread (Work);
_worker.Start();
}
public void EnqueueTask (string task) (
lock (_locker) _tasks.Enqueue (task);
_wh.Set();
}
public void Dispose() (
EnqueueTask (null); // Signal the consumer to exit.
_worker.Join(); // Wait for the consumer's thread to finish.
_wh.Close(); // Release any OS resources.
}
void Work() (
while (true)
{
string task = null;
lock (_locker)
if (_tasks.Count > 0)
{
task = _tasks.Dequeue();
if (task == null) return;
}
if (task != null)
{
Console.WriteLine ("Performing task: " + task);
Thread.Sleep (1000); // simulate work...
}
else
_wh.WaitOne(); // No more tasks - wait for a signal
}
}
}
最佳答案
您的问题很不清楚,但通常“轮询”是指定期检查条件或对值进行采样。例如:
while (true)
{
Task task = GetNextTask();
if (task != null)
{
task.Execute();
}
else
{
Thread.Sleep(5000); // Avoid tight-looping
}
}
只是休眠是一种相对低效的方式 - 如果有一些协调会更好,这样线程可以在有趣的事情发生时立即唤醒,例如通过 Monitor.Wait
/Pulse
或 Manual
/AutoResetEvent
... 但根据上下文,这并不总是可能。
在某些情况下,您可能不希望线程真正休眠——您可能希望它可以用于其他工作。例如,您可以使用一种或其他类型的 Timer
来定期轮询邮箱以查看是否有任何传入邮件 - 但您不需要线程在不检查时实际休眠;它可以被另一个线程池任务重用。
关于c#:什么是线程轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849697/