【发布时间】:2011-10-20 10:53:26
【问题描述】:
我有一个自定义集合(一个线程安全的 ObservableQueue)。我在集合类中实现了业务逻辑(即将项目逐个出列并将它们暴露给外部)。这工作正常。为了防止集合阻塞初始化它的线程, OnservableQueue 实现了一个线程来执行该工作。现在我不能完全确定可能发生的任何陷阱。
在构造函数中初始化(不启动!仅初始化)线程是不是一个坏主意?如果不是最好的,终止线程的最佳实践是什么?请注意,我不需要知道如何终止线程,它工作正常,我对天气很感兴趣,使用一次性模式或创建需要调用以终止线程的方法有问题。如果实施IDisposable,关于收集/队列有什么需要考虑的吗?
编辑:线程实际上只是预先初始化以防止NullReferenceException被抛出入队列方法,在那里它被再次正确初始化(入队方法应该检查天气出队线程已经在运行,如果不启动一个新线程)。请注意,每当所有项目都出队并且线程完成其工作时,它也将不再处于活动状态,因此每当队列为空并添加新项目时,都会启动一个新线程来处理队列:
if (!_dequeuingThread.IsAlive)
{
// start the dequeuing thread
_dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
_dequeuingThread.Name = "DeQueueThread";
_dequeuingThread.Start();
}
if 语句确实需要一个初始化的线程。还有其他可能的方法来实现这一点,但预初始化线程似乎最不麻烦。您会看到,在检查天气之后,线程还活着,在预初始化时它不应该这样做,它会再次正确初始化。
【问题讨论】:
标签: c# .net multithreading collections disposable