我有一个客户端/服务器类型的应用程序,我希望服务器对象创建自己的主机。它看起来像这样:
public class Server : IServer {
private ServiceHost m_Host;
public Server() {
m_Host = new ServiceHost(this);
m_Host.Open();
}
}
当发生少量邮件传输时似乎工作正常。但是当它开始加速时(我的应用程序需要每50毫秒传输一次数据),服务器会挂起并且几秒钟后传输停止而不会抛出异常。
那么,对象是否可以创建自己的主机?或者我真的必须在main()中创建它还是做其他事情?
编辑:我认为在这种情况下的问题是我希望实现服务本身的对象创建自己的ServiceHost。
答案 0 :(得分:0)
没有什么能阻止任何对象创建ServiceHost实例。
那么最大的问题是 - 你能保证包含服务主机的对象是“活着的”吗?或者它是否被垃圾收集?
我们使用Windows(NT)服务来托管我们自己的自定义服务主机类,以便为WCF服务提供全天候可用性 - 工作得很好。
马克
答案 1 :(得分:0)
要成为WCF服务,它只需要实现服务合同。没有什么可以阻止你添加更多方法来打开和关闭它自己作为服务的实例。
答案 2 :(得分:0)
查看ServiceBehaviorAttribute,它可以指定您的服务......的行为方式。 ;)ConcurrencyMode属性定义了对多线程的支持,默认为单线程模式,InstanceContextMode定义服务对象是每个会话,每个调用还是单个。
引自ConcurrencyMode:
将ConcurrencyMode设置为Single指示系统一次将服务实例限制为一个执行线程,这使您无需处理线程问题。值Multiple表示服务对象可以在任何时候由多个线程执行。在这种情况下,您必须确保线程安全。
来自InstanceContextMode的引用:
如果InstanceContextMode值设置为Single,则结果是您的服务一次只能处理一条消息,除非您还将ConcurrencyMode值设置为Multiple。
我们确实可以使用您服务的一些代码示例来进一步调试您所描述的行为。例如,您的服务对象构造是否昂贵(假设非单例实现),或者操作是否会变慢?你知道时间花在哪里,它是代码,还是一些限制连接的防火墙?您使用什么协议?