Не больше потенциала, чем у компонента SingleCall. У обоих будут проблемы, если они попытаются получить доступ к общей памяти в небезопасной манере.
Разница между SingleCall и Singleton заключается в том, что для SingleCall каждый входящий запрос получает новый экземпляр определенного типа, созданный для обработки этого вызова. Каждый экземпляр будет иметь свое собственное пространство памяти и переменные экземпляра, но они по-прежнему могут совместно использовать статические и глобальные переменные, внешние ресурсы, файлы, сетевые подключения и т. Д. Если класс SingleCall закодирован для доступа к любому состоянию общей памяти небезопасным для потока способом тогда у вас будут проблемы.
Синглтон, с другой стороны, получает только один экземпляр, созданный для ВСЕХ входящих запросов, поэтому по определению каждая переменная экземпляра, используемая в этом синглтоне, фактически является общей для всех входящих запросов. Хорошим примером может служить издатель сообщений, которому необходим весь код на сервере для отправки сообщений одному или нескольким подписанным клиентам ....
Чтобы обратиться к комментарию от @Cocowalla, убедитесь, что если вы сделаете это, вы переопределите метод
MarshalByRefObject.InitializeLifetimeService()
, как показано, или ваш синглтон неожиданно исчезнет, если никто не вызовет его некоторое время ...
public class MessageManager : MarshalByRefObject
{
#region Singleton / MarshalByRefObject code
private static MessageManager mgr =
new MessageManager(); // creates singleton
static MessageManager() { }
private MessageManager() { }
public static MessageManager Instance { get { return mgr; } }
public override object InitializeLifetimeService() { return (null); }
#endregion Singlelton code
// ... other stuff ...
}
// in Remoting Host initialization code...
MessageManager mgr = MessageManager.Instance; // generates singleton;
RemotingServices.Marshal(mgr, URI);