1

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

4

2 回答 2

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

于 2009-01-20T14:51:56.027 回答
2

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

另外,请记住,在使用 SingleCall 对象时,您不能在调用之间共享状态。

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

于 2009-01-20T14:46:21.653 回答