我有一个无限循环,用于消耗BlockingCollection
中的物品。
public class MessageFileLogger
{
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);
}
}
}
}
由另一个每分钟或几分钟实例化的对象所引用(可以移至1小时增量等)。>>
当不再需要引用该线程的对象时,该怎么办才能确保退出线程?public class Helper { MessageFileLogger _logger; public Helper(string logFilePath, LogMode logMode) { _logger = new MessageFileLogger(logFilePath, logMode); _logger.Enabled = true; } public void foo() { } }
问题#1)
注意:Helper只需要调用foo,因此一旦不再需要调用foo
,就可以对对象进行垃圾回收。因此,可以将using语句与Helper合并在一起。
问题#2)
是否需要处置_messageQueue
?如果是这样,我该如何处置它而不影响LogMessage
线程? (我尝试在线程运行时处理它,并且没有惊喜出现错误)。我尝试扩展IDisposable(在MessageFileLogger中):
public void Dispose() { _enabled = false; _messageQueue.Dispose(); }
而且我对此没有任何问题,但是我不确定我只是还没有问题。另外,这是否意味着
Helper
也需要IDisposable
,并且using语句需要与Helper
一起使用?
注意:该问题基于我与我的another question相同的代码。
我有一个无限循环,用于消耗BlockingCollection中的项目。公共类MessageFileLogger {私有BlockingCollection
首先,您的消费者不应拨打Thread.Sleep
。它还肯定不应该检查集合的数量。 BlockingCollection
的整个point