首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用后台工作线程生成WCF服务?

如何使用后台工作线程生成WCF服务?
EN

Stack Overflow用户
提问于 2012-06-30 13:25:26
回答 2查看 9K关注 0票数 2

我有一个所有客户端都连接到的WCF服务,以便获得通知\提醒(使用它们实现的回调接口)。目前WCF服务是自我托管的,但计划是将其托管在Windows服务中。

WCF服务具有“发布”、“订阅”和“取消订阅”操作。

我需要一个后台工作线程,每隔30分钟就有一个server数据库表轮询,并查找某些“提醒”行。一旦它找到了它们-它应该通知所有连接的客户端。

我想到了实现这一目标的两种方法。

方法A :

有一个单独的EXE项目(不希望它是一个控制台,那么它应该是什么-一个Windows服务?)它将启动并运行后台线程。后台线程将作为其客户端连接到“提醒”服务。后台线程将轮询数据库,一旦发现--它将向WCF服务发送一条“发布”消息,这将使WCF服务向所有订阅的客户端发送提醒。

方法B :

以某种方式使后台线程在WCF服务项目中运行,当它在数据库中检测到一个新的提醒行时,以某种方式让它用‘信号’通知WCF服务,然后WCF服务会将这个信息发送给所有订阅的客户端。

哪种方法更好?还有其他建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-29 02:10:06

方法A:

如果您要创建两个单独的主机(一个用于WCF服务,另一个用于“轮询”服务),那么您实际上只有一个选项可以使所有主机都很好地工作。

Windows Service通信非常有限(没有服务端点的帮助,例如WCF)。因此,如果要在Windows服务中承载“轮询”服务,则必须将其与WCF服务相结合。

然后,通过手动实例化WCF主机并将“轮询”服务传递给构造函数,将两个服务一起托管在一个Windows中是可行的。

代码语言:javascript
复制
protected override void OnStart(string[] args)
{
    //...

    // This would be you "polling" service that would start a background thread to poll the db.
    var notificationHost = new PollingService();
    // This is your WCF service which you will be "self hosted".
    var serviceHost = new WcfService(notificationHost);

    new ServiceHost(serviceHost).Open();
    //...
}

这并不理想,因为您需要通过两个服务之间的事件进行通信,而且您的WCF服务必须在单例模式下运行,才能手动实例化.所以这给你留下了..。

方法B:

如果要在WCF服务中托管“轮询”服务,则会遇到许多问题。

  1. 您需要知道创建的“轮询”服务的实例数量。如果您的WCF服务已被配置为为每个会话实例化,您可能最终会得到太多的“轮询”服务,这可能最终会杀死您的db/服务器。
  2. 为了避免第一个问题,您可能需要设置一个单例WCF服务,这可能会在不久的将来导致一个扩展问题,其中一个WCF服务实例不足以处理连接请求的数量。

方法C:

鉴于方法A和B的缺点,最好的解决方案是托管两个独立的WCF服务。

  1. 这是您有订阅/取消订阅/发布的常规服务。
  2. 这是带有订阅/取消订阅的轮询单例服务。

其想法是,您的常规服务在接收到订阅服务器时将打开到您的轮询服务的新连接或使用现有的连接(取决于您配置会话的方式),并等待回复。轮询服务是一个长期运行的WCF服务,它轮询数据库并将通知发布给它的订阅者(即其他WCF主机)。

Pros:

  1. 您可以放心,只有一个轮询服务。
  2. 您可以扩展解决方案,以便在IIS中承载常规服务,在Windows服务中托管轮询服务。
  3. 这两个服务之间的通信限制很小,不需要事件。
  4. 通过它们的接口相互依赖地测试每个服务。
  5. 服务之间的低耦合和高内聚力(这正是我们想要的!)

Cons:

  1. 更多的服务意味着需要维护更多的接口和契约。
  2. 更高的复杂性。
票数 1
EN

Stack Overflow用户

发布于 2012-06-30 13:38:40

如果这是一个长期运行的过程,windows服务就是完美的解决方案。您的主要Win Service线程将轮询DB,将结果排队到某种类型的供应商/消费者线程安全集合中。

您可以在win服务中托管一个WCF服务,然后WCF可以使用(删除)队列中的任何结果,并根据请求将它们传递回客户端(对WCF的调用将通过它们自己的线程进行)

这是一个相当常见的体系结构,并且不难实现。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11274411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档