使用无限循环处理线程

问题描述 投票:0回答:1

我有一个无限循环,用于消耗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 _messageQueue;私有线程...

c# multithreading idisposable
1个回答
6
投票

首先,您的消费者不应拨打Thread.Sleep。它还肯定不应该检查集合的数量。 BlockingCollection的整个point

© www.soinside.com 2019 - 2024. All rights reserved.