Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

□ Интерфейс

ITrackingHandler
вызывается, когда на удаленном объекте или на прокси происходит событие. Можно реализовать три метода в обработчике:
MarshaledObject
,
UnmarshaledObject
и
DisconnectedObject
.

Чтобы увидеть службы слежения в действии на клиенте и на сервере, создадим новую библиотеку классов

TrackingHandler
. Класс
TrackingHandler
реализует интерфейс
ITrackingHandler
. В методах задаются два аргумента: сам объект и
ObjRef
. С помощью
ObjRef
выдается информация об URI, канале и уполномоченных приемниках. Можно также присоединить новые приемники для добавления спонсоров всех вызываемых методов. В данном примере на консоль записывается URI и информация о канале.

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Services;
 

namespace Wrox.ProfessionalCSharp (

 public class TrackingHandler : ITrackingHandler {

public TrackingHandler {

}

public void MarshaledObject(object obj, ObjRef or) {

Console.WriteLine("--- Marshaled Object " + obj.GetType + " ---");

Console.WriteLine("Object URI: " + or.URI);

object[] ChannelData = or.ChannelInfo.ChannelData;

foreach(object data in ChannelData) {

ChannelDataStore dataStore = data as ChannelDataStore;

if (dataStore != null) {

foreach (string uri in dataStore.ChannelUris) {

Console.WriteLine("Channel URI: " + uri);

}

}

}

Console.WriteLine("---------");

Console.WriteLine;

}

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);

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

  • Читать дальше
  • 1
  • ...
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: