Книга: C# для профессионалов. Том II

Удаленный объект

Удаленный объект

Класс удаленного объекта реализуется в файле RemoteObject.cs. Класс удаленного объекта должен выводиться из MarshalByRefObject так, как было показано в предыдущих примерах. Чтобы сделать возможным для клиента регистрацию обработчика событий, который вызывается из удаленного объекта, необходимо объявить внешнюю функцию с помощью ключевого слова delegate. Мы объявляем делегата StatusEvent() с двумя аргументами: sender (поэтому клиент знает об объекте, который порождает событие) и переменную типа StatusEventArgs. В класс аргумента помещаем всю дополнительную информацию, которую необходимо послать клиенту.

Метод, который реализуется на стороне клиента, требует строгих ограничений. Он может иметь только входные параметры, возвращаемые типы, при этом параметры ref и out недопустимы; а типы аргументов должны быть либо [Serializable], либо удаленными (выводимыми из MarshalByRefObject):

public delegate void StatusEvent(object sender, StatusEventArgs e);
public class RemoteObject : MarshalByRefObject {

Внутри класса RemoteObject объявляется экземпляр функции делегата Status, модифицированный ключевым словом event. Клиент должен добавить обработчик событий в событие Status, чтобы получить статусную информацию из удаленного объекта:

public class RemoteObject : MarshalByRefObject {
 public RemoteObject() {
  Console.WriteLine("RemoteObject constructor called");
 }
 public event StatusEvent Status;

В методе LongWorking() проверяется, что обработчик событий регистрируется прежде, чем событие порождается с помощью Status(this, е). Чтобы удостовериться, что событие порождается асинхронно, мы получаем событие в начале метода перед выполнением Thread.Sleep() и после Sleep:

 public void LongWorking(int ms) {
  Console.WriteLine("RemoteObject: LongWorking() Started");
  StatusEventArgs e = new StatusEventArgs("Message for Client: LongWorking() Started");
  // породить событие
  if (Status != null) {
   Console.WriteLine("RemoteObject: Firing Starting Event");
   Status(this, e);
  }
  System.Threading.Thread.Sleep(ms);
  e.Message = "Message for Client: LongWorking() Ending"; // породить событие окончания
  if (Status != null) {
   Console.WriteLine("RemoteObject: Firing Ending Event");
   Status(this, e);
  }
  Console.WriteLine("RemoteObject: LongWorking() Ending");
 }
}

Оглавление книги


Генерация: 1.186. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз