0

我有一个自定义集合(线程安全的 ObservableQueue)。我在集合类中实现了业务逻辑(即将项目逐一出列并将它们暴露给外部)。这工作正常。为了防止集合阻塞初始化它的线程, OnservableQueue 实现了一个线程来执行该工作。现在我不能完全确定可能发生的任何陷阱。

在构造函数中初始化(而不是开始!仅初始化)线程是一个坏主意吗?如果不是最好的,终止线程的最佳实践是什么?请注意,我不需要知道如何终止线程,它工作正常,我对天气很感兴趣,使用一次性模式或创建需要调用以终止线程的方法有问题。如果实施IDisposable,关于收集/队列有什么我必须考虑的事情吗?

编辑:线程实际上只是预先初始化,以防止NullReferenceException被抛出入队方法,在那里它再次被正确初始化(入队方法应该检查天气一个出队线程是否已经运行,如果不开始一个新的) . 请注意,每当所有项目都出队并且线程完成其工作时,它也将不再处于活动状态,因此每当队列为空并添加新项目时,都会启动一个新线程来处理队列:

if (!_dequeuingThread.IsAlive)
{
    // start the dequeuing thread
    _dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
    _dequeuingThread.Name = "DeQueueThread";
    _dequeuingThread.Start();
}

if 语句确实需要一个初始化的线程。还有其他可能的方法来实现这一点,但预初始化线程似乎最不麻烦。您会看到,在检查天气后线程是活动的,在预初始化时它不应该这样做,它会再次正确初始化。

4

2 回答 2

0

我看不出在构造函数中初始化有什么问题,但很明显,它们将在与工作线程不同的线程中初始化。

至于停止,我通常有一个不稳定的布尔标志,工人检查它以保持运行。如果您的工作线程完全休眠,则让它等待事件而不是休眠,这样您就可以在停止它时立即唤醒它。

于 2011-10-20T11:02:38.663 回答
0

消费者将通过调用其构造函数来初始化此集合对象并且认为该对象已初始化(构造函数应该执行的操作)这一事实似乎存在问题,这是不正确的,因为初始化正在发生在构造函数创建的单独线程上。所以,基本上你需要在这个对象上实现某种“异步 API”来初始化这个集合,以便消费者调用 initialize 方法(在使用构造函数创建对象之后),然后通过将回调传递给 initialize 方法或通过在集合对象上注册一个事件,消费者可以知道初始化已经完成。

于 2011-10-20T11:03:22.103 回答