3

我有一个生产者 (P) 将项目推入消费者 (C)。C 可能决定在所有物品到达后不立即消费;相反,它可能会异步等待直到队列中有n 个项目或直到某个时间间隔t已经过去,然后消耗队列中的所有项目并重新启动计时器。

每当它推送到 C 的项目确实已被消费时,需要通知 P。这是因为 P 负责在发生故障时恢复(P 将当前状态保存到 DB)。因此,在重启的情况下,P 需要知道它需要再次推送哪些项目,因为它们还没有被消费者确认。

我的第一个想法是让 C 通过回调函数(委托)通知 P:每当一个项目被消费时,P 的回调函数就会被一个消费项目列表调用。

但我想知道是否可能有其他(更好的)方式通知制片人。你怎么认为?

斯特凡诺

更新:感谢您到目前为止的回答。我目前正在研究使用异步方法是否可能是一种优雅的方式来同步发布者和消费者正在发布的项目的状态。

4

5 回答 5

4

我认为你可以在没有 C 通知 P 的情况下实现你所需要的,而是使用事务队列来提供 C。只是一个讨论 MSMQ 实现的示例链接:

http://msdn.microsoft.com/en-us/library/ms978430.aspx,或者如果 MSMQ 不可用,纯 BCL 解决方案可以是:

https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/branches/rhino-queues-1.0/(或者至少只是从中获取一些想法)

编辑 我将链接更改为关于 MSMQ 解决方案的更官方的链接。

于 2011-04-07T12:36:14.350 回答
1

委托很好,尽管我会使用事件来实现它。

于 2011-04-07T12:37:05.850 回答
1

个人不知道有什么太棒的事情——你可以使用一个事件,或者生产者可以实现INotifyProcessComplete你传递给消费者的设计,或者你可以使用ManualResetEvent消费者在完成时设置/标记的事件(例如)。

于 2011-04-07T12:37:18.970 回答
1

我会扩展该项目以引发 CosumedEvent。P 注册此事件。当 C 消费该项目时,P 会收到通知,并且只需要分离事件处理程序以及它在消费项目时必须执行的操作。

于 2011-04-07T12:38:05.940 回答
0

我最终实现了一个异步设计(即在生产者/消费者接口上创建一BeginXXXEndXXX方法),因为我相信这对于 .NET 开发来说更惯用(我希望任何未来的代码维护者都熟悉用它)。

当消费者处理完项目后,它会按照模式调用回调;客户端可以通过回调同步或使用其他交互模式IAsyncResult(请参阅 MSDN 文档)。

于 2011-04-11T15:54:22.270 回答