【问题标题】:Producer and consumer with notifications in C#在 C# 中使用通知的生产者和消费者
【发布时间】:2011-04-07 12:31:46
【问题描述】:

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

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

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

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

斯特凡诺

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

【问题讨论】:

    标签: c# design-patterns producer-consumer


    【解决方案1】:

    我认为你可以在没有 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 解决方案的更官方的链接。

    【讨论】:

    • @PVitt - 值得注意的是,该概念与物理消息队列无关(如该代码示例中所示):您可以创建一个以事务方式运行的内存队列。
    • @Jess 链接是为了提供一个例子,正如 PVitt 所问的那样。当然可以实现同样的效果。
    • +1 因为 MSMQ 可能会满足我的要求,但我无法更改为当前架构以切换到 MSMQ。我需要 C# 4.0 或 .NET 4 BCL 已经可用的东西(也许我应该在我的问题中提到这一点)。
    • @Stefano 在回复中添加了另一个选项
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            • 2017-04-12
            • 1970-01-01
            • 2013-06-14
            • 2015-02-02
            • 2015-12-14
            相关资源
            最近更新 更多