我有一个 WCF 服务,有多个客户端连接到它并订阅事件。
我还有一个在后台运行的工作线程,以及托管的 WCF 服务,执行操作并将项目推送到'Producer\Consumer Queue'。
当队列中有项目时,如何使 WCF 服务采取行动,以便它可以从队列中提取项目,对其进行分析 - 并将消息发布给所有订阅的客户端?
我知道 WCF 服务会对从连接的客户端调用的操作做出反应,但是当项目排队进入此队列时,我如何让它做出响应?
如果可能的话,我将不胜感激任何可以用简单的代码示例回答的人。
我有一个 WCF 服务,有多个客户端连接到它并订阅事件。
我还有一个在后台运行的工作线程,以及托管的 WCF 服务,执行操作并将项目推送到'Producer\Consumer Queue'。
当队列中有项目时,如何使 WCF 服务采取行动,以便它可以从队列中提取项目,对其进行分析 - 并将消息发布给所有订阅的客户端?
我知道 WCF 服务会对从连接的客户端调用的操作做出反应,但是当项目排队进入此队列时,我如何让它做出响应?
如果可能的话,我将不胜感激任何可以用简单的代码示例回答的人。
最简单的是,您需要一个事件,您的 wcf 服务可以从队列中订阅入队事件,并在引发事件后开始处理消息。对于非通用队列,您可以重写 Enqueue 方法以引发 OnChanged 事件。
public override void Enqueue(object obj)
{
base.Enqueue(obj);
OnChanged(EventArgs.Empty);
}
有关如何从通用队列中引发事件的更多详细信息,请参见此处
//from worker thread
queue.Enqueue(some_object);
//in wcf you could probably do something like this
queue.OnChanged += ProcessMessage;
public void ProcessMessage(object sender, EventArgs e)
{
lock(lock_object)
{
var some_object = queue.Dequeue;
//processing logic and broadcasting to client
}
}
这是我的想法,这可能不是最好的,但它是一个开始。要为您的方案实现所需的功能,请创建两个 WCF 服务。第一个服务将被称为 QueueService,它基本上持有和管理您的队列。第二个服务称为 PublisherService,这个服务的目的是在队列中添加/删除新项目时由 QeueService 通知。要实现这一点,您必须使用双工通道(应用发布订阅模式http://msdn.microsoft.com/en-us/library/ms752254.aspx),其中 PublisherService 充当 QueueService 的客户端。现在关于将要使用 PublisherService 的客户...我不确定您到目前为止使用了什么技术。您是使用双工通道还是连续流从 PublisherService 获取数据?(http://blog.john-thiriet.com/en/2011/08/using-reactive-extensions-for-a-push-based-client-server-communication-with-silverlight-and-wcf/)