}

  public void UnmarshaledObject(object obj, ObjRef or) {

   Console.WriteLine('Unmarshal');

   public void DisconnectedObject(Object obj) {

   Console.WriteLine('Disconnect');

  }

 }

}

Серверная программа изменяется, чтобы регистрировать TrackingHandler. Необходимо добавить только две строки, чтобы зарегистрировать обработчик.

using System.Runtime.Remoting.Services;

// ...

public static void Main(string[] args) {

 TrackingServices.RegisterTrackingHandler(new TrackingHandler());

 TCPChannel channel = new TCPChannel(8086);

 // ...

При запуске сервера первый экземпляр создается во время регистрации хорошо известного типа, и мы получаем следующий вывод. Вызывается MarshaledObject() и выводит тип объекта для маршализации — Wrox.ProfessionalCSharp.Hello. С помощью Object URI мы видим GUID, который, используется внутренне в удаленной среде выполнения для различения определенных экземпляров и URI. С помощью канала URI можно проверить конфигурацию канала. В этом случае именем хоста будет Cnagel:

Асинхронная удаленная работа

Если серверные методы требуют времени для завершения работы и клиенту нужно произвести некоторую другую работу в это время- то необходимо запустить отдельный поток выполнения, чтобы сделать удаленный вызов. Асинхронные вызовы могут делаться на удаленном объекте так же, как они делаются на локальном объекте.

Чтобы сделать асинхронный метод, создается делегат GreetingDelegate с тем же аргументом и возвращается значение как метод Greeting() удаленного объекта. Аргумент этого делегата является ссылкой на метод Greeting(). Мы запускаем вызов Greeting (), используя метод делегата BeginInvoke(). Второй аргумент BeginInvoke() является экземпляром: AsyncCallback, определяющим метод НеlloClient.Callback(), который вызывается когда удаленный метод заканчивается. В методе Callback() удаленный вызов заканчивается с помощью EndInvoke():

using System;

using System.Runtime.Remoting;

namespace Wrox.ProfessionalCSharp {

 public class HelloClient {

  private delegate String GreetingDelegate(String name);

  private statiс string greeting; public static old Main(string[] args) {

   RemotingConfiguration.Configure('HelloClient.exe.config');

   Hello obj = new Hello();

   if (obj == null) {

    Console.WriteLine('could not locate server');

    return 0;

   }

   // синхронная версия

   // string greeting = obj.Greeting('Christian');

   // асинхронная версия

   GreetingDelegate d = new GreetingDelegate(obj.Greeting);

   IAsyncResult ar = d.BeginInvoke('Christian', null, null);

   // выполнить некоторую работу и затем ждать

   ar.AsyncWaitHandle.WaitOne();

   if (ar.IsCompleted) {

    greeting = d.EndInvoke(ar);

   }

   Console. WriteLine(greeting);

  }

 }

}

О событиях, делегатах и асинхронных методах можно прочитать в главе 6.

Атрибут OneWay

Метод, который возвращает void и имеет только входящие параметры, может быть помечен атрибутом OneWay. Атрибут OneWay делает метод автоматически асинхронным независимо от того, как вызывает его клиент. Добавление метода TakeAWhile() в класс удаленного объекта RemoteHello соответствует созданию метода 'породить и забыть'. Если клиент вызывает его через прокси, то прокси немедленно возвращает управление клиенту. На сервере метод заканчивается немного позже:

[OneWay]

public Void TakeAWhile(int ms) {

 Console.WriteLine('TakeAWhile started');

 System.Threading.Thread.Sleep(ms);

 Console.WriteLine('TakeAWhile finished');

}

Удаленное выполнение и события

С помощью .NET Remoting не только клиент может вызывать методы на удаленном объекте через сеть, но и сервер может также вызывать методы на клиенте. Для этого используются детали механизма основных свойств языка: делегаты и события.

В принципе это простая архитектура. Сервер имеет объект, который может вызывать клиент, а клиент имеет объект, который в свою очередь может вызывать сервер:

□ Удаленный объект на сервере должен объявить внешнюю функцию (делегата) с сигнатурой

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату