设计模式——c#中带有通知的生产者和消费者

本文关键字:生产者 消费者 通知 设计模式 | 更新日期: 2023-09-27 17:48:59

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

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

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

但是我想知道是否有其他(更好的)方法来通知制作人。你是怎么想的?

斯特凡诺

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

设计模式——c#中带有通知的生产者和消费者

我认为您可以实现您所需要的,而不需要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解决方案的更官方的链接。

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

我个人不知道有什么太神奇的-你可以使用一个事件,或者生产者可能会实现你的设计的INotifyProcessComplete,你传递给消费者,或者你可以使用一个事件(例如ManualResetEvent),消费者设置/标记时,它完成

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

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

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