使用C#通知的生产者和消费者

时间:2011-04-07 12:31:47

标签: c# design-patterns producer-consumer

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

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

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

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

斯特凡诺

更新:感谢您到目前为止的答案。我目前正在调查是否使用异步方法可以优雅地将发布者和消费者同步发布项目的状态。

5 个答案:

答案 0 :(得分: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解决方案的更正式的链接。

答案 1 :(得分:1)

代理人很好,虽然我会使用一个事件来实现它。

答案 2 :(得分:1)

个人不知道任何太奇妙的东西 - 你可以使用一个事件,或者生产者可能实现你传递给消费者的你设计的INotifyProcessComplete,或者你可以使用一个事件(例如{{1}消费者在完成时设置/标记的内容。

答案 3 :(得分:1)

我会扩展项目以抛出CosumedEvent。 P为此事件注册。当C消耗该项时,P会被通知,只需要分离事件处理程序以及项目消耗后必须执行的操作。

答案 4 :(得分:0)

我最终实现了Asynchronous Design(即在生产者/消费者界面上创建BeginXXXEndXXX对方法),因为我认为这更加惯用于.NET开发(我希望此代码的任何未来维护者都熟悉它)。

当消费者处理完该项时,它会根据模式调用回调;客户端可以通过IAsyncResult同步回调或使用其他交互模式(参见MSDN文档)。