Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1082

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
753.13 Кб
Скачать

Console.WriteLine("Main() в потоке {0}", Thread.CurrentThread.ManagedThreadld);

//вызвать Add() в синхронном режиме

BinaryOp b = new BinaryOp(Add);

//можно было бы также написать b.Invoke(10, 10); int answer = b(10, 10);

//строки не будут выполняться, пока не завершится метод

Add()

Console.WriteLine(“Main() ждет завершения метода

Add!");

Console.WriteLine(“10 + 10 = {0}", answer);

Console.ReadLine();

}

static int Add(int x, int y)

{

//вывести идентификатор выполняющегося потока

Console.WriteLine("Add() в потоке {0}", Thread.CurrentThread.ManagedThreadld);

//пауза 5 секунд для моделирования длительной операции

Thread.Sleep(5000); return x + у;

}

Рис. 7. Синхронный вызов делегата

39

Когда компилятор С# обрабатывает ключевое слово delegate, динамически сгенерированный класс определяет два метода: BeginInvoke() и EndInvoke().

Для делегата BinaryOp эти методы таковы:

public sealed class BinaryOp : System.MulticastDelegate

{

// используется для асинхронного вызова метода

public IAsyncResult Beginlnvoke(int x, int y, AsyncCallback cb, object state);

// для получения возвращаемого значения вызванного метода public int Endlnvoke(IAsyncResult result);

}

Первый стек параметров, переданный BeginInvoke(), будет основан на формате делегата (в случае BinaryOp - два целых).

Последними двумя аргументами всегда будут

System.AsyncCallback и System.Object.

Возвращаемое значение EndInvoke() является целым, как тип возврата BinaryOp, не смотря на то, что параметр этого метода имеет тип IAsyncResult.

Метод BeginInvoke() всегда возвращает объект, реализующий интерфейс IAsyncResult.

Метод EndInvoke() ожидает 1 параметр типа, совмести-

мого с типом IAsyncResult.

Совместимый с IAsyncResult объект, возвращаемый из BeginInvoke() позволяет вызывающему потоку получить поз-

же результат вызова асинхронного метода через EndInvoke().

Чтобы делегат BinaryOp вызвал Add() асинхронно, модифицируем метод Main() следующим образом:

static void Main()

{

Console.WriteLine ("***** Асинхронный вызов делегата *****");

40

// вывести идентификатор выполняющегося потока

Console.WriteLine("Main() вызван в потоке {0}.", Thread.CurrentThread.ManagedThreadld);

//вызвать Add() во вторичном потоке

BinaryOp b = new BinaryOp(Add);

IAsyncResult lftAR = b.Beginlnvoke(10, 10, null, null);

//выполнить другую работу в первичном потоке...

Console.WriteLine(“Работа Main()!");

//получить результат метода Add() по готовности

int answer = b.Endlnvoke(iftAR); Console.WriteLine ("10 + 10 = {0}", answer); Console.ReadLine();

}

Рис. 8. Асинхронный вызов делегата

Выводятся два идентификатора потоков, т.к. в текущем домене приложения работает несколько потоков:

Как только сообщение «Работа Main()!" будет выведено на консоль, вызывающий поток блокируется и ожидает, пока вторичный поток завершится, чтобы получить результат вызова метода Add().

Поэтому на самом деле производится ещё один синхронный вызов.

41

static void Main()

{

BinaryOp b = new BinaryOp(Add);

//вызывающий поток блокируется, пока

//не будет завершён Beginlnvoke()

IAsyncResult iftAR = b.Beginlnvoke(10, 10, null, null);

// этот вызов займет намного меньше 5 секунд

Console.WriteLine(“Работа Main()!"); int answer = b.Endlnvoke(iftAR);

}

ЗАДАНИЕ

1.По аналогии с примером из раздела «Теоретические сведения» получить список всех процессов текущего компьютера.

2.Вывести информацию о процессе, заданном номером

PID. Вывести информацию о сборках данного процесса.

3.Запустить программно процесс, остановить его.

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

5.По аналогии с приведёнными выше примерами соз-

дать домен приложения и загрузить в него библиотеку

Shapes.dll.

6.Выгрузить созданный в 5 задании домен приложения.

7.Получить сведения о текущем потоке и содержащем его домене приложений.

8.По аналогии с примером составить функцию вы-

числения факториала целого числа (с 1 параметром (целым) и возвращаемым целым значением) с помощью делегата с синхронным и асинхронным вызовом.

42

КОНТРОЛЬНЫЕ ВОПРОСЫ

1.Что такое домен приложения?

2.Как создаются домены приложения?

3. Как связаны между собой процессы, домены и потоки?

4.Как получить сведения о работающих процессах?

5.Как программно создать и выгрузить домен?

6.Можно ли выгрузить сборки из домена?

7.В чём преимущество асинхронного вызова делегата?

СОДЕРЖАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

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

43

ЗАКЛЮЧЕНИЕ

Методические указания необходимы для выполнения контрольных работ по дисциплине «Разработка приложений в Visual Studio» студентами заочной формы обучения. В методических указаниях в компактной и доступной для понимания форме изложен материал по основным приемам использования доменов приложений, автоматически созданных потоков, динамического создания объектов, особенностям программирования на платформе .NET Framework; приведено достаточное количество примеров, иллюстрирующих технологии использования системы программирования. Представленный материал позволит студентам грамотно выполнить контрольные работы, освоить технику программирования в системе

Microsoft Visual Studio.

44

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1.Троелсен Э. Язык программирования С# 2010 и платформа .NET 4.0 / Э. Троелсен. – М.: Вильямс, 2011. – 1392 с.

2.Шилдт Г. C# 3.0: полное руководство / Г. Шилдт. –

М.: Вильямс, 2010. – 992 с.

3.Электронный ресурс: http://professorweb.ru/my/csharp/base_net/level1/net_index.php

4.Климов А.С. С#. Советы программистам / А.С. Климов. – СПб.: БХВ-Петербург, 2008. – 544 с.

45

ОГЛАВЛЕНИЕ

 

Введение ..............................................................................................

1

Работа № 1. Сборки .NET. работа с дизассемблером......................

2

Работа № 2. Рефлексия .....................................................................

10

Работа № 3. Динамическое создание объектов..............................

18

Работа № 4. Процессы, домены приложений, потоки...................

27

Заключение ........................................................................................

44

Библиографический список .............................................................

45

46

Учебное издание

Составитель:

Ганцева Екатерина Александровна

СБОРКИ .NET

МЕТОДИЧЕСКИЕ УКАЗАНИЯ к выполнению контрольных работ по дисциплине

«Разработка приложений в Visual Studio» для студентов направления 09.03.01 «Информатика и вычислительная техника», профиля «Вычислительные машины, комплексы, системы и сети» заочной формы обучения

В авторской редакции

Подписано к изданию 16.11.2017. Уч.-изд. л. 2,7.

ФГБОУ ВО «Воронежский государственный технический университет»

394026 Воронеж, Московский просп., 14

0