Ограничение класса .NET одним экземпляром объекта на границе компьютера => межпроцессный синглтон

Я хочу, чтобы один объект некоторого класса .NET использовался несколькими процессами на одном компьютере.

Имея домены приложений, пересечь эту границу непросто, но файлы с отображением памяти в .NET 4.0 должны каким-то образом облегчить эту задачу.

Пока .NET 4.0 не выйдет в финальной версии... Можно ли сделать какой-то "межпроцессный синглтон" на С#?


person Jox    schedule 08.08.2009    source источник


Ответы (3)


Да, вы можете создать синглтон .Net Remoting в одном процессе и предоставить его другим процессам, работающим на том же компьютере, через Remoting...

РЕДАКТИРОВАТЬ: в .Net 2.x вам нужно использовать решение для удаленного взаимодействия, но в .Net 3.x или более поздних версиях (где доступен WCF) эта же функциональность может быть доступна с использованием WCF (проверьте это вне)...

person Charles Bretana    schedule 08.08.2009
comment
Это нужно делать через WCF, а не через Remoting. Удаленное взаимодействие устарело в пользу WCF. - person John Saunders; 09.08.2009
comment
@John, спасибо, признаюсь, я не так знаком с деталями WCF, как должен был бы ... там, где я работал, я только что смог использовать CLR 3.x или материал WCF ... узнать об этом больше сейчас - person Charles Bretana; 11.08.2009
comment
С заданными требованиями я не думаю, что это выполнимо через WCF. .NET Remoting обеспечит постоянное сохранение идентификатора объекта, а WCF — нет. Кроме того, отказ от Remoting следует воспринимать с долей скептицизма — это просто технология, сильно отличающаяся от WCF по своим принципам разработки, и поэтому бывают ситуации, когда тот или иной просто работает лучше. - person Pavel Minaev; 11.08.2009

Вы можете использовать глобальный мьютекс.

В Threading in C# есть хороший пример (скопированный ниже для удобства) того, как используйте именованный мьютекс, чтобы на машине мог работать только один экземпляр приложения.

Вы можете расширить этот пример, чтобы убедиться, что существует только один экземпляр объекта.

class OneAtATimePlease {
  // Use a name unique to the application (eg include your company URL)
  static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo");

  static void Main() {
    // Wait 5 seconds if contended – in case another instance
    // of the program is in the process of shutting down.

    if (!mutex.WaitOne (TimeSpan.FromSeconds (5), false)) {
      Console.WriteLine ("Another instance of the app is running. Bye!");
      return;
    }
    try {
      Console.WriteLine ("Running - press Enter to exit");
      Console.ReadLine();
    }
    finally { mutex.ReleaseMutex(); }
  }
}

Есть еще одна вещь, на которую вам, возможно, следует обратить внимание.

При использовании именованного мьютекса на сервере, работающем в службах терминалов, именованный мьютекс может иметь два уровня видимости: глобальный для всех сеансов (имя с префиксом "Global\" ) или Local для сеанса сервера терминалов (имя с префиксом "Local\", оно будет использоваться по умолчанию, если префикс не указан).

Дополнительную информацию о Mutex можно найти в MSDN: класс Mutex.

person Chansik Im    schedule 08.08.2009
comment
этот код запрещает второму процессу создавать новый объект, но не дает ему ссылку на уже существующий. Любое решение для этого? Кроме того, спасибо за ваше время ... - person Jox; 09.08.2009
comment
Я бы рекомендовал WCF для межпроцессного взаимодействия. В общем, NetNamedPipeBinding — хороший выбор для межпроцессного взаимодействия внутри машины. - person Chansik Im; 10.08.2009

Установите .net dll в глобальный кеш сборки. Затем на него может ссылаться любое приложение на компьютере.

person TommyL    schedule 26.10.2009
comment
Почти уверен, что он имеет в виду экземпляр, а не определение. - person Matthew Whited; 26.10.2009
comment
Точно, мне нужно больше процессов для использования одного и того же object, а не одного класса. - person Jox; 02.11.2009