我有一个消费者为生产者消费者图案的一部分:生产者/消费者 - 生产者使用高CPU
简化:
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用法爬到一个非常高的(13%),而不是0%,设置线程睡觉。另外,如果我实例化类的多个实例,则CPU使用率以13%的增量上升,并且每个实例都会增加13%。
每隔一分钟左右(可能每隔30秒)将一个新的LogItem添加到BlockingCollection中,并将适用的消息写入文件。
是否有可能线程以某种方式阻止其他线程运行,并且系统需要补偿?
更新: 更新代码,以更好地反映实际的代码
即使队列中没有任何内容,您的发布代码也会处理项目。 –