Remoting (на стороне сервера) - PullRequest
0 голосов
/ 15 июня 2009

Я относительно новичок в удаленном взаимодействии (2.0 C #). Есть ли какой-либо / каким-либо образом заблокировать объект / экземпляр на стороне сервера для одного клиента?

У меня до 10 клиентов, которые будут подключаться к серверу. Сервер предложит 3 разные задачи / операции / классы, и если один клиент делает запрос, и если сервер не работает над этим, я хотел бы заблокировать эту операцию для этого клиента. Причина этого заключается в том, что запросы работают с HW, которые могут выполнять только задачи в данный момент. Надеюсь, ты понимаешь, что я тоже люблю делать.

EDIT:

Я попытаюсь объяснить мою проблему снова ...

У меня есть 3 класса, у которых будет X количество методов / операций (операции, которые будут запускать внешнее оборудование для выполнения некоторых измерений). Когда клиент «подключается» к одному классу (одновременно) и запрашивает измерение, я хочу привязать этот класс к клиенту, следовательно, клиент будет владеть этим классом и сможет выполнять все методы. Ни один другой клиент не может / не может получить доступ к этому классу, пока первый клиент имеет контроль. Другие классы буксировки должны быть открыты для запросов от других клиентов, но тот же принцип / правила должны применяться к этим классам. Как только клиент запрашивает блокировку, он должен иметь ее, пока она этого требует. У меня будет интерфейс, которому должны следовать все клиенты. Вызовите метод Lock (), чтобы потребовать контроль над классом, и Unlock (), чтобы освободить элемент управления. Я / Мы разработаем все клиенты и сервер!

Спасибо за помощь, пока!

Привет

/ Anders

Ответы [ 3 ]

0 голосов
/ 15 июня 2009

Хорошо, теперь я вижу смысл.

Вместо этого вы можете использовать подход CAO: создать фабрику (может быть одноэлементной), которая дает вам CAO (объект, активированный клиентом), если никто не владеет экземпляром. CAO хорош для этого, потому что он гарантирует, что если клиент умрет, CAO будет освобожден.

Объяснять CAO слишком просто для простого ответа, это что-то вроде этого: CAO - это класс, унаследованный от MarshalByRefObject, который вы создадите из своей фабрики и вернете экземпляр из одного метода (т. Е. Ваш метод Lock); объект живет на сервере, а клиент получает только прокси. Объект будет жить на сервере, пока клиент обновляет его аренду (выполняется автоматически, когда на объект ссылаются, а клиент жив).

Вы можете взглянуть на статьи Инго Раммера и книги по удаленному взаимодействию.

0 голосов
/ 16 июня 2009

jmservera, спасибо за вашу помощь.

Теперь я нашел решение, которое будет работать на меня ... Я использую шаблон прокси в сочетании с заводским шаблоном. Я использую метод WellKnownObjectMode.Singleton, чтобы контролировать количество активных экземпляров на моем сервере.

И, делая это таким образом, мне не нужно делиться своим кодом с клиентом, а только интерфейсом (как вы сказали ранее).

Привет

/ Андерс

0 голосов
/ 15 июня 2009

Вы должны заблокировать задачу с помощью семафоров, чтобы обеспечить только один поток за один раз. Посмотрите на семафор и Mutex классы.


Edit: Вы можете сделать много способов от блокировки до сложных семафоров, здесь у вас есть два примера:

Эта блокировка блокирует только одно выполнение:

private static object lockObject=new object();
public void Test()
{
  lock (lockObject)
  {
    //your code here
  }
}

Этот использует Mutex, чтобы ждать, пока он не будет выпущен, но с таймаутом, который вернет клиенту некоторую информацию, указывающую, что метод не может быть выполнен.

private static Mutex mutex = new Mutex();
public bool Test2()
{
   if (!mutex.WaitOne(500))
   {
     return false;
   }
   try
   {
     //your code here
   }
   finally
   {
     mutex.ReleaseMutex();
   }
   return true;
}
...