使用服务器激活对象使用.NET Remoting时,SingleCall和Singleton激活之间的权衡是什么?

时间:2009-01-20 14:41:29

标签: .net remoting

在使用.NET Remoting实现服务器来托管对象时,我试图辨别SingleCall和Singleton激活方法之间的区别。似乎SingleCall具有必须为每个客户端调用构造和清理对象的开销,而Singleton具有仅能够服务有限数量的同时请求的限制。我希望尽可能提高性能。我应该选择哪个?

2 个答案:

答案 0 :(得分:3)

你是对的。 SingleCall为每个调用构建对象,并且可以接受多个同时发出的请求,但是数据不能在调用之间共享,而Singleton构建单个对象来处理允许数据共享的多个调用,但限制了同时连接。但是,如果你有一些关于如何构建线程安全对象的概念,你可以做一些调整。

首先,我建议使用Singleton,因为它只为许多人创建了一次。这样做的另一个好处是,您可以存储信息并在连接到它的用户之间共享信息,而无需经常访问外部商店。

其次,我会考虑将ConcurrencyMode = ConcurrencyMode.Multiple添加到服务的ServiceBehaviors中。这允许多个用户同时击中你的单身。

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class CalculatorService : ICalculatorConcurrency 
{ 
    …
}

第三,清理任何会使该类不是线程安全的代码。在访问多个线程可以同时访问的局部变量时,应该锁定对象。

可以在此处找到有关这些主题的大量有用信息:

http://msdn.microsoft.com/en-us/library/ms731193.aspx

答案 1 :(得分:2)

默认情况下,您应该使用SingleCall。

另外,请记住,使用SingleCall对象时,您无法共享呼叫状态。

我发现这个站点在.NET远程处理方面是一个很好的资源: http://www.thinktecture.com/resourcearchive/net-remoting-faq/remotingusecases