Книга: 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");
}
}
- Активация хорошо известных объектов
- Объект WshRemote
- Удаленный доступ
- Активизация объектов, активизированных клиентом
- Удаленные объекты, клиенты и серверы
- 1.1. Введение в объектно-ориентированное программирование
- ЧАСТЬ IV. База данных и ее объекты.
- 1.1.1. Что такое объект
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Физические объекты
- Иерархия объектов в InterBase
- Имена объектов длиной 68 символов