C#ConcurrentQueue - 当Enqueue发生时引发事件?

时间:2012-07-03 14:24:40

标签: wcf triggers concurrent-collections

我有一个托管在Windows服务中的WCF服务。

WCF服务注入ConcurrentQueue<SomeClass>

Windows服务(承载WCF服务)也注入了ConcurrentQueue<SomeClass>

Windows服务启动WCF服务,并生成工作线程。

工作线程将Enqueue的{​​{1}}对象推送到SomeClass

我想以某种方式在一个对象排队到ConccurrentQueue时触发WCF服务,以便它可以使它(以及可能在队列中的任何其他对象)出列,并发送消息给所有连接的客户。

两个问题:

  1. 如何在注入的ConccurentQueue的'Enqueue'方法上进行WCF服务'hook',这样当对象被推入队列时--WCF服务会对它做些什么?

  2. 如果我设法以某种方式挂钩'Enqueue'事件,现在Windows服务中的工作线程已将两个对象排入队列 - 这意味着它也会'触发'WCF服务''Enqueue hook'两次 - 这两个触发事件会在不同的线程中发生吗?我需要以某种方式确保WCF服务按顺序从队列中提取对象。我不想突然看到每个Enqueue操作 - WCF服务在一个单独的线程中触发并拉出对象......

  3. 我希望我的问题足够清楚......

    [更新]

    在与Chris聊天之后,我得出的结论是,最好的方法是从WCF服务中分离工作线程,并使工作线程作为客户端调用WCF服务。这意味着我不必使用队列。

1 个答案:

答案 0 :(得分:3)

将ConcurrentQueue包装在一个公开Enqueue&amp; amp;出列呼叫,然后将你的钩子放在这个类中。每当调用YourClass.Enqueue时,触发WCF活动,该活动可以调用YourClass.Dequeue。 YourClass.Dequeue将耗尽队列&amp;将它放入一个有序的枚举中,然后WCF服务可以按顺序处理。