我有一个自定义集合(一个线程安全的ObservableQueue)。我在集合类中实现了业务逻辑(即逐项将项目出列并将它们暴露给外部)。这工作正常。为了防止集合阻塞它初始化的线程,OnservableQueue实现了一个线程来执行该工作。现在我不完全确定可能发生的任何陷阱。
在构造函数中初始化(不启动!仅初始化)线程是一个坏主意吗?什么是好的,如果不是最好的,终止线程的做法?注意,我不需要知道如何终止一个线程,这工作正常,我对天气感兴趣,使用一次性模式或创建一个需要调用终止线程的方法有一些错误。如果实施IDisposable
,我是否需要考虑有关收集/队列的任何事情?
编辑:线程实际上只是预先初始化,以防止在{1}}中引入NullReferenceException
,然后再次正确启动它(Enqueue方法应该检查天气一个出列的线程已经运行,如果没有开始一个新的)。请注意,每当所有项目都已出列并且线程已完成其工作时,它也将不再存活,因此每当队列为空并添加新项目时,新线程将开始处理队列:
if (!_dequeuingThread.IsAlive)
{
// start the dequeuing thread
_dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
_dequeuingThread.Name = "DeQueueThread";
_dequeuingThread.Start();
}
if语句确实需要一个初始化的线程。还有其他可能的方法来实现这一点,但预先初始化线程似乎是最麻烦的。你看到在检查天气之后线程是活着的,在预先初始化时它不应该被重新初始化。
答案 0 :(得分:0)
我没有看到在构造函数中初始化有什么问题,但显然我们会在与工作线程不同的线程中初始化它们。
至于停止,我通常有一个挥发性布尔标志,工人检查以继续运行。如果您的工作线程完全休眠,那么让它等待事件而不是休眠,这样您就可以在停止时立即将其唤醒。
答案 1 :(得分:0)
消费者通过调用它的构造函数来初始化这个集合对象这一事实似乎存在问题,并且它会认为该对象已初始化(构造函数应该做什么),这是不正确的初始化发生在构造函数创建的单独线程上。所以,基本上你需要实现某种“在这个对象上的异步API”来初始化这个集合,以便消费者调用initialize方法(在使用构造函数创建对象之后)然后通过将回调传递给initialize方法或者通过注册到集合对象上的事件,消费者可以知道初始化已经完成。