我有一個消費者爲生產者消費者圖案的一部分:生產者/消費者 - 生產者使用高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中,並將適用的消息寫入文件。
是否有可能線程以某種方式阻止其他線程運行,並且系統需要補償?
更新: 更新代碼,以更好地反映實際的代碼
即使隊列中沒有任何內容,您的發佈代碼也會處理項目。 –