2010-08-27 64 views
1

(为理由 - 我从来没有使用线程的工作所以下面的描述仅仅是一个想法,我希望你能骂)线程,队列和工作流程

的任务概述:
- 有一些名单对象
- 我们需要检查对象是否以某种方式更改
- 如果更改 - 应用一些逻辑(例如 - 显示通知)。

这是我认为它应该实现:

我们创造定时器,触发每分钟,这遍历对象列表,找到需要进行检查的对象。之后,我们将该对象(或特定的 - 包含对象和任务描述的某个任务对象,以检查它是否已更新)添加到队列中。

工作者(线程池中的某个线程)等待,直到将某些内容添加到队列中,并在发生之后 - 它接受任务并对其进行处理:检查对象是否已更改。如果是这样 - 它增加了另一个任务,通知一个。现在,如果有必要,处理通知任务的另一名工作人员将处理此任务。

那么,这是完全错误的想法?这里可以改进或改变什么?

UPD:根据第一个回答:对象依赖于某些repote资源,而“change”意味着某些远程数据发生了变化(或以某种特定方式更改)。所以这不能用INotifyPropertyChanged来解决。

回答

3

如果这些'对象'是.NET对象,为什么要轮询它们?为什么不实施类似INotifyPropertyChanged界面的东西,并且有适当的,即时的更改通知?

否则,如果它们实际上可以可以通过查询测试某种外界物体,然后将触发关闭一个事件,然后轮询每个对象,并调用通知回UI线程定时器可能足够的,或者如果你想要定时器事件快速完成(例如它可以立即响应另一个事件),请发起一个Task去检查每个对象,并通知UI(使用Invoke)是否已经改变。

没有必要排队每个单独的对象并分别处理它们(是否存在),也没有任何需要并行处理它们,因此在工作线程(或Task)中对它们进行简单循环似乎就足够了。

+0

有 - 因为“检查”操作可能是“长”,因为对象与某些远程第三方资源有关。 – zerkms 2010-08-27 06:03:47

+0

“,也没有任何要求并行处理它们,所以在工作线程中对它们进行简单循环” - 在这种情况下,所有工作时间和工作要做的逻辑 - 在同一个地方。有一个问题,我描述了当它们完全被队列分隔时的场景:一部分是做出更新决定,另一部分是做出决定处理,并在它们之间排队。 – zerkms 2010-08-27 06:07:40

+0

我会说,这个答案或多或少是正确的 - 在对象上循环播放,触发一个Task来轮询每个对象,并向UI线程报告。这样你就不必担心管理轮询线程等问题了。 – 2010-08-27 06:16:44

0

我只是想知道你是否可以考虑队列等待任务。任何推送到此队列的任务对象都等待处理。在您的工作线程中,您将阻塞队列,直到某个项目可用。如果你想要一些并行性,你可能会有多个工作线程来做这件事。

您可能还有一份显示正在进行中的任务的列表,以及另一份显示哪些完成的列表。

我不是C#程序员,但在Java中,我期待使用BlockingQueue接口的实现。

+0

不,我的场景中的队列是应该处理的任务,只要任何工作人员可用于执行。 – zerkms 2010-08-27 06:10:27