【问题标题】:Share a BlockingCollection across processes跨进程共享 BlockingCollection
【发布时间】:2014-11-19 17:41:06
【问题描述】:

有没有办法在两个 .net 应用程序之间共享相同的 BlockingCollection,一个应用程序产生新项目,另一个应用程序使用它们?

我发现的进程间通信选项似乎都涉及序列化和反序列化数据,所以如果我将 BlockingCollection 从一个进程传递到另一个进程,我会得到一个断开连接的副本,以及对原始集合的后续更新不会影响副本。

与回调或信号量相比,BlockingCollection 的使用确实简化了生产者-消费者关系,因此如果可能的话,我希望在进程之间交换数据时继续使用它们。

(BlockingCollection 的语义是:
生产者可以简单地向集合中添加新项目,而无需担心额外的锁或同步。
消费者可以简单地迭代集合,当没有新项目时迭代器阻塞,每当产生一个新项目时,一个消费者会被自动唤醒并解除阻塞)

两个进程将在同一台机器上运行。将生产者和消费者分成不同的进程的目标之一是允许消费者在生产者运行时重新启动或修改。因此,理想情况下,我正在寻找一个生产者不必了解消费者的解决方案。

【问题讨论】:

  • 如果一个进程是生产者,另一个是消费者,只需使用IPC将新项目从生产者发送到消费者进程。在消费者端拥有BlockingCollection,并在消费者端添加新项目。
  • 这种情况下的生产者不一定知道消费者,即消费者可能不会一直在运行,或者可能会重新启动或更换。 (这是在这种情况下将两者分开的目的之一)。我想消费者可以向生产者注册回调,或者监听生产者设置的信号量,但我更喜欢生产者与消费者共享 BlockingCollection 的优雅。我怀疑这不会那么容易。
  • if I where to pass a BlockingCollection from one process to the other 不,只是传递数据(使用序列化/反序列化)

标签: c# ipc named-pipes producer-consumer inter-process-communicat


【解决方案1】:

根据您的需求描述(即您的生产者添加项目,而消费者在添加项目之前一直在睡觉),我建议使用 MSMQ。

一个进程将消息添加到队列中,另一个进程正在等待新消息可用。等待的线程将被阻塞,直到有消息可用(不使用轮询)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2010-11-23
    • 2020-05-10
    • 2010-11-29
    • 2012-09-19
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多