【发布时间】:2014-02-26 19:39:08
【问题描述】:
我有一个消费者作为生产者消费者模式的一部分:
简化:
public class MessageFileLogger : ILogger
{
private BlockingCollection<ILogItem> _messageQueue;
private Thread _worker;
private bool _enabled = false;
public MessageFileLogger()
{
_worker = new Thread(LogMessage);
_worker.IsBackground = true;
_worker.Start();
}
private void LogMessage()
{
while (_enabled)
{
if (_messageQueue.Count > 0)
{
itm = _messageQueue.Take();
processItem(itm);
}
else
{
Thread.Sleep(1000);
}
}
}
}
如果我删除了
Thread.Sleep(1000);
将线程设置为睡眠状态时,CPU 使用率从 0% 攀升至极高 (13%)。
另外,如果我实例化该类的多个实例,每个实例的 CPU 使用率都会增加 13%。
大约每分钟左右(可能每 30 秒)将一个新的 LogItem 添加到 BlockingCollection,并将适用的消息写入文件。
是否有可能线程以某种方式阻塞了其他线程的运行,而系统需要以某种方式进行补偿?
更新: 更新代码以更好地反映实际代码
【问题讨论】:
-
即使队列中没有任何内容,您发布的代码也会处理项目。
标签: thread-safety sleep cpu-usage